X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=utils%2Fext-core%2FEnv.hs;h=642df00b7283754a2c32c81510f52af8261dc27a;hb=c14c7b82c82806bf9c8333e50c6648c3a58cd951;hp=6f6973c558f1dcf6dbab894fcdb1e8290cd9107f;hpb=0065d5ab628975892cea1ec7303f968c3338cbe1;p=ghc-hetmet.git diff --git a/utils/ext-core/Env.hs b/utils/ext-core/Env.hs index 6f6973c..642df00 100644 --- a/utils/ext-core/Env.hs +++ b/utils/ext-core/Env.hs @@ -1,6 +1,6 @@ {- Environments. - Uses lists for simplicity and to make the semantics clear. - A real implementation should use balanced trees or hash tables. + The original version used lists. I changed it to use Data.Map. + Sadly it doesn't seem to matter much. --tjc -} module Env (Env, @@ -9,36 +9,41 @@ module Env (Env, eextend, edomain, efromlist, + etolist, efilter, eremove) where -import List +import qualified Data.Map as M +import Data.List -data Env a b = Env [(a,b)] - deriving (Show) +data Env a b = Env (M.Map a b) + deriving Show eempty :: Env a b -eempty = Env [] +eempty = Env M.empty {- In case of duplicates, returns most recently added entry. -} -elookup :: (Eq a) => Env a b -> a -> Maybe b -elookup (Env l) k = lookup k l +elookup :: (Eq a, Ord a) => Env a b -> a -> Maybe b +elookup (Env l) k = M.lookup k l {- May hide existing entries. -} -eextend :: Env a b -> (a,b) -> Env a b -eextend (Env l) (k,d) = Env ((k,d):l) +eextend :: Ord a => Env a b -> (a,b) -> Env a b +eextend (Env l) (k,d) = Env (M.insert k d l) edomain :: (Eq a) => Env a b -> [a] -edomain (Env l) = nub (map fst l) +edomain (Env l) = M.keys l {- In case of duplicates, first entry hides others. -} -efromlist :: [(a,b)] -> Env a b -efromlist l = Env l +efromlist :: Ord a => [(a,b)] -> Env a b +efromlist = Env . M.fromList -eremove :: (Eq a) => Env a b -> a -> Env a b -eremove (Env l) k = Env (filter ((/= k).fst) l) +etolist :: Env a b -> [(a,b)] +etolist (Env l) = M.toList l -efilter :: Env a b -> (a -> Bool) -> Env a b -efilter (Env l) p = Env (filter (p.fst) l) +eremove :: (Eq a, Ord a) => Env a b -> a -> Env a b +eremove (Env l) k = Env (M.delete k l) + +efilter :: Ord a => Env a b -> (a -> Bool) -> Env a b +efilter (Env l) p = Env (M.filterWithKey (\ k a -> p k) l)