[project @ 1999-05-11 16:37:29 by keithw]
[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, lookupWithDefaultVarEnv,
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 lookupWithDefaultVarEnv :: VarEnv a -> a -> Var -> a
76 elemVarEnv        :: Var -> VarEnv a -> Bool
77 foldVarEnv        :: (a -> b -> b) -> b -> VarEnv a -> b
78 \end{code}
79
80 \begin{code}
81 elemVarEnv       = elemUFM
82 extendVarEnv     = addToUFM
83 plusVarEnv_C     = plusUFM_C
84 delVarEnvList    = delListFromUFM
85 delVarEnv        = delFromUFM
86 plusVarEnv       = plusUFM
87 lookupVarEnv     = lookupUFM
88 lookupWithDefaultVarEnv = lookupWithDefaultUFM
89 mapVarEnv        = mapUFM
90 mkVarEnv         = listToUFM
91 emptyVarEnv      = emptyUFM
92 rngVarEnv        = eltsUFM
93 unitVarEnv       = unitUFM
94 isEmptyVarEnv    = isNullUFM
95 foldVarEnv       = foldUFM
96
97 zipVarEnv tyvars tys       = listToUFM (zipEqual "zipVarEnv" tyvars tys)
98 extendVarEnvList env pairs = plusUFM env (listToUFM pairs)
99 lookupVarEnv_NF env id     = case (lookupVarEnv env id) of { Just xx -> xx }
100 \end{code}
101
102 @modifyVarEnv@: Look up a thing in the VarEnv, 
103 then mash it with the modify function, and put it back.
104
105 \begin{code}
106 modifyVarEnv mangle_fn env key
107   = case (lookupVarEnv env key) of
108       Nothing -> env
109       Just xx -> extendVarEnv env key (mangle_fn xx)
110
111 modifyVarEnv_Directly mangle_fn env key
112   = case (lookupUFM_Directly env key) of
113       Nothing -> env
114       Just xx -> addToUFM_Directly env key (mangle_fn xx)
115 \end{code}