plutils

programming language utilities
git clone git://git.rr3.xyz/plutils
Log | Files | Refs | Submodules

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)