% % (c) The Foo Project, University of Glasgow, 1998 % % @(#) $Docid: Oct. 16th 2001 10:39 Sigbjorn Finne $ % @(#) $Contactid: sof@galconn.com $ % A basic environment abstraction, hiding its representation (currently, finite maps..oops, wasn't suppose to tell you this :-( ) \begin{code} module Env ( Env{- key elt -} -- abstract. , newEnv -- :: Env key elt , addToEnv -- :: Ord a => Env a b -> a -> b -> Env a b , addToEnv_C -- :: Ord a => (b -> b -> b) -> Env a b -> a -> b -> Env a b , replaceElt -- :: Ord a => Env a b -> a -> b -> Env a b , delFromEnv -- :: Ord a => Env a b -> a -> Env a b , addListToEnv -- :: Ord a => Env a b -> [(a, b)] -> Env a b , addListToEnv_C -- :: Ord a => (b -> b -> b) -> Env a b -> [(a, b)] -> Env a b , lookupEnv -- :: Ord a => Env a b -> a -> Maybe b , envToList -- :: Env a b -> [(a,b)] , mapEnv -- :: (a -> b -> c) -> Env a b -> Env a c , mapMaybeEnv -- :: Ord a => (a -> b -> Maybe c) -> Env a b -> Env a c , unionEnvs -- :: [Env a b] -> Env a b ) where import FiniteMap \end{code} \begin{code} type Env a b = FiniteMap a b newEnv :: Env a b newEnv = emptyFM addToEnv :: Ord a => Env a b -> a -> b -> Env a b addToEnv fm key elt = addToFM fm key elt delFromEnv :: Ord a => Env a b -> a -> Env a b delFromEnv fm key = delFromFM fm key addToEnv_C :: Ord a => (b -> b -> b) -> Env a b -> a -> b -> Env a b addToEnv_C f fm key elt = addToFM_C f fm key elt -- The same behaviour as addToEnv, but it really doesn't hurt -- to be explicit about this. replaceElt :: Ord a => Env a b -> a -> b -> Env a b replaceElt fm key new_elt = addToFM_C (\ _ new -> new) fm key new_elt addListToEnv :: Ord a => Env a b -> [(a, b)] -> Env a b addListToEnv fm ls = addListToFM fm ls addListToEnv_C :: Ord a => (b -> b -> b) -> Env a b -> [(a, b)] -> Env a b addListToEnv_C f fm ls = addListToFM_C f fm ls lookupEnv :: Ord a => Env a b -> a -> Maybe b lookupEnv fm k = lookupFM fm k envToList :: Env a b -> [(a,b)] envToList fm = fmToList fm mapEnv :: (a -> b -> c) -> Env a b -> Env a c mapEnv f fm = mapFM f fm mapMaybeEnv :: Ord a => (a -> b -> Maybe c) -> Env a b -> Env a c mapMaybeEnv f fm = mapMaybeFM f fm unionEnvs :: (Ord a) => [Env a b] -> Env a b unionEnvs ls = foldl (\ acc x -> plusFM x acc) newEnv ls \end{code}