[project @ 1996-01-08 20:28:12 by partain]
[ghc-hetmet.git] / ghc / compiler / envs / IdEnv.lhs
1 %
2 % (c) The AQUA Project, Glasgow University, 1995
3 %
4 \section[IdEnv]{Lookup tables that have @Id@ keys}
5
6 An interface to the @FiniteMap@ machinery, which exports
7 a ``personality'' the same as that of the old @IdEnv@ module.
8
9 \begin{code}
10 #include "HsVersions.h"
11
12 module IdEnv (
13         IdEnv(..),  -- abstract: NOT
14
15         lookupIdEnv, lookupNoFailIdEnv,
16         nullIdEnv, unitIdEnv, mkIdEnv, growIdEnv, growIdEnvList,
17         isNullIdEnv,
18         addOneToIdEnv,
19         delOneFromIdEnv, delManyFromIdEnv, --UNUSED: minusIdEnv,
20         modifyIdEnv, combineIdEnvs,
21         rngIdEnv,
22         mapIdEnv,
23 -- UNUSED:      filterIdEnv,
24
25         -- and to make the interface self-sufficient...
26         UniqFM,
27         Id, Unique, Maybe(..)
28         
29         -- and for pragma-friendliness...
30 #ifdef USE_ATTACK_PRAGMAS
31         , addToUFM, plusUFM_C, delListFromUFM, delFromUFM, plusUFM,
32         lookupUFM, mapUFM, filterUFM, minusUFM, listToUFM, emptyUFM,
33         eltsUFM, singletonUFM,
34         u2i
35 #endif
36     ) where
37
38 import UniqFM
39 import Id
40 import IdInfo
41 import Maybes           ( Maybe(..), MaybeErr(..) )
42 import Outputable
43 import Unique           ( Unique, u2i )
44 import Util
45 \end{code}
46
47 \begin{code}
48 type IdEnv elt = UniqFM elt
49 \end{code}
50
51 Signatures:
52 \begin{code}
53 addOneToIdEnv :: IdEnv a -> Id -> a -> IdEnv a
54 combineIdEnvs :: (a -> a -> a) -> IdEnv a -> IdEnv a -> IdEnv a
55 delManyFromIdEnv :: IdEnv a -> [Id] -> IdEnv a
56 delOneFromIdEnv :: IdEnv a -> Id -> IdEnv a
57 growIdEnv :: IdEnv a -> IdEnv a -> IdEnv a
58 growIdEnvList :: IdEnv a -> [(Id, a)] -> IdEnv a
59 isNullIdEnv :: IdEnv a -> Bool
60 lookupIdEnv :: IdEnv a -> Id -> Maybe a
61 lookupNoFailIdEnv :: IdEnv a -> Id -> a
62 mapIdEnv :: (a -> b) -> IdEnv a -> IdEnv b
63 --filterIdEnv :: (a -> Bool) -> IdEnv a -> IdEnv a
64 --minusIdEnv :: IdEnv a -> IdEnv a -> IdEnv a
65 mkIdEnv :: [(Id, a)] -> IdEnv a
66 modifyIdEnv :: IdEnv a -> (a -> a) -> Id -> IdEnv a
67 nullIdEnv :: IdEnv a
68 rngIdEnv :: IdEnv a -> [a]
69 unitIdEnv :: Id -> a -> IdEnv a
70 \end{code}
71
72 \begin{code}
73 addOneToIdEnv env id elt = addToUFM env id elt
74
75 combineIdEnvs combiner env1 env2 = plusUFM_C combiner env1 env2
76
77 delManyFromIdEnv env ids = delListFromUFM env ids
78
79 delOneFromIdEnv env id = delFromUFM env id
80
81 growIdEnv old_env new_stuff = plusUFM old_env new_stuff
82
83 growIdEnvList old_env pairs = plusUFM old_env (listToUFM pairs)
84
85 isNullIdEnv env = sizeUFM env == 0
86
87 lookupIdEnv env id = lookupUFM env id
88
89 lookupNoFailIdEnv env id = case (lookupIdEnv env id) of { Just xx -> xx }
90
91 mapIdEnv f env = mapUFM f env
92
93 {- UNUSED:
94 filterIdEnv p env = filterUFM p env
95 minusIdEnv env1 env2 = minusUFM env1 env2
96 -}
97
98 mkIdEnv stuff = listToUFM stuff
99
100 -- modifyIdEnv: Look up a thing in the IdEnv, then mash it with the
101 -- modify function, and put it back.
102
103 modifyIdEnv env mangle_fn key
104   = case (lookupIdEnv env key) of
105       Nothing -> env
106       Just xx -> addOneToIdEnv env key (mangle_fn xx)
107
108 nullIdEnv = emptyUFM
109
110 rngIdEnv env = eltsUFM env
111
112 unitIdEnv id elt = singletonUFM id elt
113 \end{code}