[project @ 1998-12-18 17:40:31 by simonpj]
[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
19         TidyEnv, emptyTidyEnv
20     ) where
21
22 #include "HsVersions.h"
23
24 import OccName  ( TidyOccEnv, emptyTidyOccEnv )
25 import Var      ( Var, Id, IdOrTyVar )
26 import UniqFM
27 import Util     ( zipEqual )
28 \end{code}
29
30
31 %************************************************************************
32 %*                                                                      *
33 \subsection{Tidying}
34 %*                                                                      *
35 %************************************************************************
36
37 When tidying up print names, we keep a mapping of in-scope occ-names
38 (the TidyOccEnv) and a Var-to-Var of the current renamings.
39
40 \begin{code}
41 type TidyEnv = (TidyOccEnv, VarEnv IdOrTyVar)
42 emptyTidyEnv = (emptyTidyOccEnv, emptyVarEnv)
43 \end{code}
44
45
46 %************************************************************************
47 %*                                                                      *
48 \subsection{@VarEnv@s}
49 %*                                                                      *
50 %************************************************************************
51
52 \begin{code}
53 type VarEnv elt   = UniqFM elt
54 type IdEnv elt    = VarEnv elt
55 type TyVarEnv elt = VarEnv elt
56
57 emptyVarEnv       :: VarEnv a
58 mkVarEnv          :: [(Var, a)] -> VarEnv a
59 zipVarEnv         :: [Var] -> [a] -> VarEnv a
60 unitVarEnv        :: Var -> a -> VarEnv a
61 extendVarEnv      :: VarEnv a -> Var -> a -> VarEnv a
62 plusVarEnv        :: VarEnv a -> VarEnv a -> VarEnv a
63 extendVarEnvList  :: VarEnv a -> [(Var, a)] -> VarEnv a
64                   
65 delVarEnvList     :: VarEnv a -> [Var] -> VarEnv a
66 delVarEnv         :: VarEnv a -> Var -> VarEnv a
67 plusVarEnv_C      :: (a -> a -> a) -> VarEnv a -> VarEnv a -> VarEnv a
68 mapVarEnv         :: (a -> b) -> VarEnv a -> VarEnv b
69 modifyVarEnv      :: (a -> a) -> VarEnv a -> Var -> VarEnv a
70 rngVarEnv         :: VarEnv a -> [a]
71                   
72 isEmptyVarEnv     :: VarEnv a -> Bool
73 lookupVarEnv      :: VarEnv a -> Var -> Maybe a
74 lookupVarEnv_NF   :: VarEnv a -> Var -> a
75 elemVarEnv        :: Var -> VarEnv a -> Bool
76 foldVarEnv        :: (a -> b -> b) -> b -> VarEnv a -> b
77 \end{code}
78
79 \begin{code}
80 elemVarEnv       = elemUFM
81 extendVarEnv     = addToUFM
82 plusVarEnv_C     = plusUFM_C
83 delVarEnvList    = delListFromUFM
84 delVarEnv        = delFromUFM
85 plusVarEnv       = plusUFM
86 lookupVarEnv     = lookupUFM
87 mapVarEnv        = mapUFM
88 mkVarEnv         = listToUFM
89 emptyVarEnv      = emptyUFM
90 rngVarEnv        = eltsUFM
91 unitVarEnv       = unitUFM
92 isEmptyVarEnv    = isNullUFM
93 foldVarEnv       = foldUFM
94
95 zipVarEnv tyvars tys       = listToUFM (zipEqual "zipVarEnv" tyvars tys)
96 extendVarEnvList env pairs = plusUFM env (listToUFM pairs)
97 lookupVarEnv_NF env id     = case (lookupVarEnv env id) of { Just xx -> xx }
98 \end{code}
99
100 @modifyVarEnv@: Look up a thing in the VarEnv, 
101 then mash it with the modify function, and put it back.
102
103 \begin{code}
104 modifyVarEnv mangle_fn env key
105   = case (lookupVarEnv env key) of
106       Nothing -> env
107       Just xx -> extendVarEnv env key (mangle_fn xx)
108
109 modifyVarEnv_Directly mangle_fn env key
110   = case (lookupUFM_Directly env key) of
111       Nothing -> env
112       Just xx -> addToUFM_Directly env key (mangle_fn xx)
113 \end{code}