hdirect-0.21.0: src/Env.lhs
%
% (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}