Remove Distribution.Compat.Char from compat again
[ghc-hetmet.git] / utils / ext-core / Language / Core / Env.hs
1 {- Environments.
2   The original version used lists. I changed it to use Data.Map.
3   Sadly it doesn't seem to matter much. --tjc
4 -}
5
6 module Language.Core.Env (Env,
7             eempty,
8             elookup,
9             eextend,
10             edomain,
11             efromlist,
12             etolist,
13             efilter,
14             eremove)
15 where
16
17 import qualified Data.Map as M
18
19 data Env a b = Env (M.Map a b)
20  deriving Show
21
22 eempty :: Env a b 
23 eempty = Env M.empty
24
25 {- In case of duplicates, returns most recently added entry. -}
26 elookup :: (Eq a, Ord a) => Env a b -> a -> Maybe b
27 elookup (Env l) k = M.lookup k l 
28
29 {- May hide existing entries. -}
30 eextend :: Ord a => Env a b -> (a,b) -> Env a b
31 eextend (Env l) (k,d) = Env (M.insert k d l)
32
33 edomain :: (Eq a) => Env a b -> [a]
34 edomain (Env l) = M.keys l
35
36 {- In case of duplicates, first entry hides others. -}
37 efromlist :: Ord a => [(a,b)] -> Env a b
38 efromlist = Env . M.fromList
39
40 etolist :: Env a b -> [(a,b)]
41 etolist (Env l) = M.toList l
42
43 eremove :: (Eq a, Ord a)  => Env a b -> a -> Env a b
44 eremove (Env l) k = Env (M.delete k l)
45
46 efilter :: Ord a => Env a b -> (a -> Bool) -> Env a b
47 efilter (Env l) p = Env (M.filterWithKey (\ k _ -> p k) l)
48