2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section{@VarEnvs@: Variable environments}
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,
16 modifyVarEnv, modifyVarEnv_Directly,
17 isEmptyVarEnv, foldVarEnv,
20 TidyEnv, emptyTidyEnv,
23 SubstEnv, TyVarSubstEnv, SubstResult(..), emptySubstEnv,
24 mkSubstEnv, lookupSubstEnv, extendSubstEnv, extendSubstEnvList,
25 delSubstEnv, noTypeSubst, isEmptySubstEnv
28 #include "HsVersions.h"
30 import {-# SOURCE #-} CoreSyn( CoreExpr )
31 import {-# SOURCE #-} TypeRep( Type )
33 import OccName ( TidyOccEnv, emptyTidyOccEnv )
34 import Var ( Var, Id, IdOrTyVar )
36 import Util ( zipEqual )
40 %************************************************************************
44 %************************************************************************
46 When tidying up print names, we keep a mapping of in-scope occ-names
47 (the TidyOccEnv) and a Var-to-Var of the current renamings.
50 type TidyEnv = (TidyOccEnv, VarEnv IdOrTyVar)
51 emptyTidyEnv = (emptyTidyOccEnv, emptyVarEnv)
55 %************************************************************************
57 \subsection{Substitution environments}
59 %************************************************************************
63 noTys :: SubstResult -> Bool -> Bool
64 noTys (DoneTy ty) no_tys = False
65 noTys other no_tys = no_tys
67 data SubstEnv = SE (VarEnv SubstResult)
68 Bool -- True => definitely no type substitutions in the env
70 noTypeSubst :: SubstEnv -> Bool
71 noTypeSubst (SE _ nt) = nt
73 type TyVarSubstEnv = SubstEnv -- of the form (DoneTy ty) *only*
76 = DoneEx CoreExpr -- Completed term
77 | DoneTy Type -- Completed type
78 | ContEx SubstEnv CoreExpr -- A suspended substitution
80 emptySubstEnv :: SubstEnv
81 emptySubstEnv = SE emptyVarEnv True
83 isEmptySubstEnv :: SubstEnv -> Bool
84 isEmptySubstEnv (SE s _) = isEmptyVarEnv s
86 lookupSubstEnv :: SubstEnv -> Var -> Maybe SubstResult
87 lookupSubstEnv (SE s _) v = lookupVarEnv s v
89 extendSubstEnv :: SubstEnv -> Var -> SubstResult -> SubstEnv
90 extendSubstEnv (SE s nt) v r = SE (extendVarEnv s v r) (noTys r nt)
92 mkSubstEnv :: [IdOrTyVar] -> [SubstResult] -> SubstEnv
93 mkSubstEnv bs vs = extendSubstEnvList emptySubstEnv bs vs
95 extendSubstEnvList :: SubstEnv -> [IdOrTyVar] -> [SubstResult] -> SubstEnv
96 extendSubstEnvList env [] [] = env
97 extendSubstEnvList (SE env nt) (b:bs) (r:rs) = extendSubstEnvList (SE (extendVarEnv env b r) (noTys r nt)) bs rs
99 delSubstEnv :: SubstEnv -> IdOrTyVar -> SubstEnv
100 delSubstEnv (SE s nt) v = SE (delVarEnv s v) nt
104 %************************************************************************
106 \subsection{@VarEnv@s}
108 %************************************************************************
111 type VarEnv elt = UniqFM elt
112 type IdEnv elt = VarEnv elt
113 type TyVarEnv elt = VarEnv elt
115 emptyVarEnv :: VarEnv a
116 mkVarEnv :: [(Var, a)] -> VarEnv a
117 zipVarEnv :: [Var] -> [a] -> VarEnv a
118 unitVarEnv :: Var -> a -> VarEnv a
119 extendVarEnv :: VarEnv a -> Var -> a -> VarEnv a
120 plusVarEnv :: VarEnv a -> VarEnv a -> VarEnv a
121 extendVarEnvList :: VarEnv a -> [(Var, a)] -> VarEnv a
123 delVarEnvList :: VarEnv a -> [Var] -> VarEnv a
124 delVarEnv :: VarEnv a -> Var -> VarEnv a
125 plusVarEnv_C :: (a -> a -> a) -> VarEnv a -> VarEnv a -> VarEnv a
126 mapVarEnv :: (a -> b) -> VarEnv a -> VarEnv b
127 modifyVarEnv :: (a -> a) -> VarEnv a -> Var -> VarEnv a
128 rngVarEnv :: VarEnv a -> [a]
130 isEmptyVarEnv :: VarEnv a -> Bool
131 lookupVarEnv :: VarEnv a -> Var -> Maybe a
132 lookupVarEnv_NF :: VarEnv a -> Var -> a
133 lookupWithDefaultVarEnv :: VarEnv a -> a -> Var -> a
134 elemVarEnv :: Var -> VarEnv a -> Bool
135 foldVarEnv :: (a -> b -> b) -> b -> VarEnv a -> b
140 extendVarEnv = addToUFM
141 plusVarEnv_C = plusUFM_C
142 delVarEnvList = delListFromUFM
143 delVarEnv = delFromUFM
145 lookupVarEnv = lookupUFM
146 lookupWithDefaultVarEnv = lookupWithDefaultUFM
149 emptyVarEnv = emptyUFM
152 isEmptyVarEnv = isNullUFM
155 zipVarEnv tyvars tys = listToUFM (zipEqual "zipVarEnv" tyvars tys)
156 extendVarEnvList env pairs = plusUFM env (listToUFM pairs)
157 lookupVarEnv_NF env id = case (lookupVarEnv env id) of { Just xx -> xx }
160 @modifyVarEnv@: Look up a thing in the VarEnv,
161 then mash it with the modify function, and put it back.
164 modifyVarEnv mangle_fn env key
165 = case (lookupVarEnv env key) of
167 Just xx -> extendVarEnv env key (mangle_fn xx)
169 modifyVarEnv_Directly mangle_fn env key
170 = case (lookupUFM_Directly env key) of
172 Just xx -> addToUFM_Directly env key (mangle_fn xx)