[project @ 1998-12-02 13:17:09 by simonm]
[ghc-hetmet.git] / ghc / compiler / basicTypes / VarEnv.lhs
1
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
3 %
4 \section{@VarEnvs@: Variable environments}
5
6 \begin{code}
7 module VarEnv (
8         VarEnv, IdEnv, TyVarEnv,
9         emptyVarEnv, unitVarEnv, mkVarEnv,
10         elemVarEnv, rngVarEnv,
11         extendVarEnv, extendVarEnvList,
12         plusVarEnv, plusVarEnv_C,
13         delVarEnvList, delVarEnv,
14         lookupVarEnv, lookupVarEnv_NF,
15         mapVarEnv, zipVarEnv,
16         modifyVarEnv, modifyVarEnv_Directly,
17         isEmptyVarEnv, foldVarEnv
18     ) where
19
20 #include "HsVersions.h"
21
22 import Var      ( Var, Id )
23 import UniqFM
24 import Util     ( zipEqual )
25 \end{code}
26
27
28 %************************************************************************
29 %*                                                                      *
30 \subsection{@VarEnv@s}
31 %*                                                                      *
32 %************************************************************************
33
34 \begin{code}
35 type VarEnv elt   = UniqFM elt
36 type IdEnv elt    = VarEnv elt
37 type TyVarEnv elt = VarEnv elt
38
39 emptyVarEnv       :: VarEnv a
40 mkVarEnv          :: [(Var fs ft, a)] -> VarEnv a
41 zipVarEnv         :: [Var fs ft] -> [a] -> VarEnv a
42 unitVarEnv        :: Var fs ft -> a -> VarEnv a
43 extendVarEnv      :: VarEnv a -> Var fs ft -> a -> VarEnv a
44 plusVarEnv        :: VarEnv a -> VarEnv a -> VarEnv a
45 extendVarEnvList  :: VarEnv a -> [(Var fs ft, a)] -> VarEnv a
46                   
47 delVarEnvList     :: VarEnv a -> [Var fs ft] -> VarEnv a
48 delVarEnv         :: VarEnv a -> Var fs ft -> VarEnv a
49 plusVarEnv_C      :: (a -> a -> a) -> VarEnv a -> VarEnv a -> VarEnv a
50 mapVarEnv         :: (a -> b) -> VarEnv a -> VarEnv b
51 modifyVarEnv      :: (a -> a) -> VarEnv a -> Var fs ft -> VarEnv a
52 rngVarEnv         :: VarEnv a -> [a]
53                   
54 isEmptyVarEnv     :: VarEnv a -> Bool
55 lookupVarEnv      :: VarEnv a -> Var fs ft -> Maybe a
56 lookupVarEnv_NF   :: VarEnv a -> Var fs ft -> a
57 elemVarEnv        :: Var fs ft -> VarEnv a -> Bool
58 foldVarEnv        :: (a -> b -> b) -> b -> VarEnv a -> b
59 \end{code}
60
61 \begin{code}
62 elemVarEnv       = elemUFM
63 extendVarEnv     = addToUFM
64 plusVarEnv_C     = plusUFM_C
65 delVarEnvList    = delListFromUFM
66 delVarEnv        = delFromUFM
67 plusVarEnv       = plusUFM
68 lookupVarEnv     = lookupUFM
69 mapVarEnv        = mapUFM
70 mkVarEnv         = listToUFM
71 emptyVarEnv      = emptyUFM
72 rngVarEnv        = eltsUFM
73 unitVarEnv       = unitUFM
74 isEmptyVarEnv    = isNullUFM
75 foldVarEnv       = foldUFM
76
77 zipVarEnv tyvars tys       = listToUFM (zipEqual "zipVarEnv" tyvars tys)
78 extendVarEnvList env pairs = plusUFM env (listToUFM pairs)
79 lookupVarEnv_NF env id     = case (lookupVarEnv env id) of { Just xx -> xx }
80 \end{code}
81
82 @modifyVarEnv@: Look up a thing in the VarEnv, 
83 then mash it with the modify function, and put it back.
84
85 \begin{code}
86 modifyVarEnv mangle_fn env key
87   = case (lookupVarEnv env key) of
88       Nothing -> env
89       Just xx -> extendVarEnv env key (mangle_fn xx)
90
91 modifyVarEnv_Directly mangle_fn env key
92   = case (lookupUFM_Directly env key) of
93       Nothing -> env
94       Just xx -> addToUFM_Directly env key (mangle_fn xx)
95 \end{code}