4b8085da9ccda019d60e9c3d02892e76aea6f67f
[ghc-hetmet.git] / compiler / basicTypes / NameEnv.lhs
1 %
2 % (c) The University of Glasgow 2006
3 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 %
5 \section[NameEnv]{@NameEnv@: name environments}
6
7 \begin{code}
8 module NameEnv (
9         -- * Var, Id and TyVar environments (maps) 
10         NameEnv, 
11         
12         -- ** Manipulating these environments
13         mkNameEnv,
14         emptyNameEnv, unitNameEnv, nameEnvElts, nameEnvUniqueElts,
15         extendNameEnv_C, extendNameEnv_Acc, extendNameEnv,
16         extendNameEnvList, extendNameEnvList_C,
17         foldNameEnv, filterNameEnv,
18         plusNameEnv, plusNameEnv_C, 
19         lookupNameEnv, lookupNameEnv_NF, delFromNameEnv, delListFromNameEnv,
20         elemNameEnv, mapNameEnv
21     ) where
22
23 #include "HsVersions.h"
24
25 import Name
26 import Unique
27 import LazyUniqFM
28 import Maybes
29 import Outputable
30 \end{code}
31
32 %************************************************************************
33 %*                                                                      *
34 \subsection{Name environment}
35 %*                                                                      *
36 %************************************************************************
37
38 \begin{code}
39 newtype NameEnv a = A (UniqFM a)        -- Domain is Name
40
41 emptyNameEnv       :: NameEnv a
42 mkNameEnv          :: [(Name,a)] -> NameEnv a
43 nameEnvElts        :: NameEnv a -> [a]
44 nameEnvUniqueElts  :: NameEnv a -> [(Unique, a)]
45 extendNameEnv_C    :: (a->a->a) -> NameEnv a -> Name -> a -> NameEnv a
46 extendNameEnv_Acc  :: (a->b->b) -> (a->b) -> NameEnv b -> Name -> a -> NameEnv b
47 extendNameEnv      :: NameEnv a -> Name -> a -> NameEnv a
48 plusNameEnv        :: NameEnv a -> NameEnv a -> NameEnv a
49 plusNameEnv_C      :: (a->a->a) -> NameEnv a -> NameEnv a -> NameEnv a
50 extendNameEnvList  :: NameEnv a -> [(Name,a)] -> NameEnv a
51 extendNameEnvList_C :: (a->a->a) -> NameEnv a -> [(Name,a)] -> NameEnv a
52 delFromNameEnv     :: NameEnv a -> Name -> NameEnv a
53 delListFromNameEnv :: NameEnv a -> [Name] -> NameEnv a
54 elemNameEnv        :: Name -> NameEnv a -> Bool
55 unitNameEnv        :: Name -> a -> NameEnv a
56 lookupNameEnv      :: NameEnv a -> Name -> Maybe a
57 lookupNameEnv_NF   :: NameEnv a -> Name -> a
58 foldNameEnv        :: (a -> b -> b) -> b -> NameEnv a -> b
59 filterNameEnv      :: (elt -> Bool) -> NameEnv elt -> NameEnv elt
60 mapNameEnv         :: (elt1 -> elt2) -> NameEnv elt1 -> NameEnv elt2
61
62 nameEnvElts (A x) = eltsUFM x
63 emptyNameEnv     = A emptyUFM
64 unitNameEnv x y = A $ unitUFM x y 
65 extendNameEnv (A x) y z = A $ addToUFM x y z
66 extendNameEnvList (A x) l = A $ addListToUFM x l
67 lookupNameEnv (A x) y = lookupUFM x y
68 mkNameEnv     l    = A $ listToUFM l
69 elemNameEnv x (A y)      = elemUFM x y
70 foldNameEnv a b (A c)    = foldUFM a b c 
71 plusNameEnv (A x) (A y)  = A $ plusUFM x y 
72 plusNameEnv_C f (A x) (A y)      = A $ plusUFM_C f x y 
73 extendNameEnv_C f (A x) y z   = A $ addToUFM_C f x y z
74 mapNameEnv f (A x)       = A $ mapUFM f x
75 nameEnvUniqueElts (A x)  = ufmToList x
76 extendNameEnv_Acc x y (A z) a b  = A $ addToUFM_Acc x y z a b
77 extendNameEnvList_C x (A y) z = A $ addListToUFM_C x y z
78 delFromNameEnv (A x) y    = A $ delFromUFM x y
79 delListFromNameEnv (A x) y  = A $ delListFromUFM x y
80 filterNameEnv x (A y)       = A $ filterUFM x y
81
82 lookupNameEnv_NF env n = expectJust "lookupNameEnv_NF" (lookupNameEnv env n)
83
84 instance Outputable a => Outputable (NameEnv a) where
85     ppr (A x) = ppr x
86 \end{code}
87