2 The original version used lists. I changed it to use Data.Map.
3 Sadly it doesn't seem to matter much. --tjc
17 import qualified Data.Map as M
20 data Env a b = Env (M.Map a b)
26 {- In case of duplicates, returns most recently added entry. -}
27 elookup :: (Eq a, Ord a) => Env a b -> a -> Maybe b
28 elookup (Env l) k = M.lookup k l
30 {- May hide existing entries. -}
31 eextend :: Ord a => Env a b -> (a,b) -> Env a b
32 eextend (Env l) (k,d) = Env (M.insert k d l)
34 edomain :: (Eq a) => Env a b -> [a]
35 edomain (Env l) = M.keys l
37 {- In case of duplicates, first entry hides others. -}
38 efromlist :: Ord a => [(a,b)] -> Env a b
39 efromlist = Env . M.fromList
41 etolist :: Env a b -> [(a,b)]
42 etolist (Env l) = M.toList l
44 eremove :: (Eq a, Ord a) => Env a b -> a -> Env a b
45 eremove (Env l) k = Env (M.delete k l)
47 efilter :: Ord a => Env a b -> (a -> Bool) -> Env a b
48 efilter (Env l) p = Env (M.filterWithKey (\ k a -> p k) l)