ShadowMap.hs (874B)
1 module PlUtils.ShadowMap ( 2 ShadowMap, 3 empty, 4 assign, 5 lookup, 6 ) where 7 8 import Data.List ((!?)) 9 import Data.Map.Strict (Map) 10 import Data.Map.Strict qualified as Map 11 import Naturals.Nat 12 import Prelude hiding (lookup) 13 14 insertOrAdjust :: (Ord k) => v -> (v -> v) -> k -> Map k v -> Map k v 15 insertOrAdjust i a = Map.alter \case 16 Nothing -> Just i 17 Just v -> Just (a v) 18 19 -- | A @ShadowMap@ is a (strict) @Map@ that supports shadowing values without 20 -- overwriting them. 21 newtype ShadowMap k v = ShadowMap (Map k [v]) deriving (Show, Eq, Functor) 22 23 empty :: (Ord k) => ShadowMap k v 24 empty = ShadowMap Map.empty 25 26 assign :: (Ord k) => k -> v -> ShadowMap k v -> ShadowMap k v 27 assign k v (ShadowMap m) = ShadowMap (insertOrAdjust [v] (v :) k m) 28 29 lookup :: (Ord k) => k -> Nat -> ShadowMap k v -> Maybe v 30 lookup k i (ShadowMap m) = Map.lookup k m >>= (!? fromNat i)