never executed always true always false
1 {-
2 (c) The University of Glasgow 2006
3 (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4
5 \section[TyConEnv]{@TyConEnv@: tyCon environments}
6 -}
7
8
9 {-# LANGUAGE ScopedTypeVariables #-}
10
11
12 module GHC.Core.TyCon.Env (
13 -- * TyCon environment (map)
14 TyConEnv,
15
16 -- ** Manipulating these environments
17 mkTyConEnv, mkTyConEnvWith,
18 emptyTyConEnv, isEmptyTyConEnv,
19 unitTyConEnv, nonDetTyConEnvElts,
20 extendTyConEnv_C, extendTyConEnv_Acc, extendTyConEnv,
21 extendTyConEnvList, extendTyConEnvList_C,
22 filterTyConEnv, anyTyConEnv,
23 plusTyConEnv, plusTyConEnv_C, plusTyConEnv_CD, plusTyConEnv_CD2, alterTyConEnv,
24 lookupTyConEnv, lookupTyConEnv_NF, delFromTyConEnv, delListFromTyConEnv,
25 elemTyConEnv, mapTyConEnv, disjointTyConEnv,
26
27 DTyConEnv,
28
29 emptyDTyConEnv, isEmptyDTyConEnv,
30 lookupDTyConEnv,
31 delFromDTyConEnv, filterDTyConEnv,
32 mapDTyConEnv, mapMaybeDTyConEnv,
33 adjustDTyConEnv, alterDTyConEnv, extendDTyConEnv, foldDTyConEnv
34 ) where
35
36 import GHC.Prelude
37
38 import GHC.Types.Unique.FM
39 import GHC.Types.Unique.DFM
40 import GHC.Core.TyCon (TyCon)
41
42 import GHC.Data.Maybe
43
44 {-
45 ************************************************************************
46 * *
47 \subsection{TyCon environment}
48 * *
49 ************************************************************************
50 -}
51
52 -- | TyCon Environment
53 type TyConEnv a = UniqFM TyCon a -- Domain is TyCon
54
55 emptyTyConEnv :: TyConEnv a
56 isEmptyTyConEnv :: TyConEnv a -> Bool
57 mkTyConEnv :: [(TyCon,a)] -> TyConEnv a
58 mkTyConEnvWith :: (a -> TyCon) -> [a] -> TyConEnv a
59 nonDetTyConEnvElts :: TyConEnv a -> [a]
60 alterTyConEnv :: (Maybe a-> Maybe a) -> TyConEnv a -> TyCon -> TyConEnv a
61 extendTyConEnv_C :: (a->a->a) -> TyConEnv a -> TyCon -> a -> TyConEnv a
62 extendTyConEnv_Acc :: (a->b->b) -> (a->b) -> TyConEnv b -> TyCon -> a -> TyConEnv b
63 extendTyConEnv :: TyConEnv a -> TyCon -> a -> TyConEnv a
64 plusTyConEnv :: TyConEnv a -> TyConEnv a -> TyConEnv a
65 plusTyConEnv_C :: (a->a->a) -> TyConEnv a -> TyConEnv a -> TyConEnv a
66 plusTyConEnv_CD :: (a->a->a) -> TyConEnv a -> a -> TyConEnv a -> a -> TyConEnv a
67 plusTyConEnv_CD2 :: (Maybe a->Maybe a->a) -> TyConEnv a -> TyConEnv a -> TyConEnv a
68 extendTyConEnvList :: TyConEnv a -> [(TyCon,a)] -> TyConEnv a
69 extendTyConEnvList_C :: (a->a->a) -> TyConEnv a -> [(TyCon,a)] -> TyConEnv a
70 delFromTyConEnv :: TyConEnv a -> TyCon -> TyConEnv a
71 delListFromTyConEnv :: TyConEnv a -> [TyCon] -> TyConEnv a
72 elemTyConEnv :: TyCon -> TyConEnv a -> Bool
73 unitTyConEnv :: TyCon -> a -> TyConEnv a
74 lookupTyConEnv :: TyConEnv a -> TyCon -> Maybe a
75 lookupTyConEnv_NF :: TyConEnv a -> TyCon -> a
76 filterTyConEnv :: (elt -> Bool) -> TyConEnv elt -> TyConEnv elt
77 anyTyConEnv :: (elt -> Bool) -> TyConEnv elt -> Bool
78 mapTyConEnv :: (elt1 -> elt2) -> TyConEnv elt1 -> TyConEnv elt2
79 disjointTyConEnv :: TyConEnv a -> TyConEnv a -> Bool
80
81 nonDetTyConEnvElts x = nonDetEltsUFM x
82 emptyTyConEnv = emptyUFM
83 isEmptyTyConEnv = isNullUFM
84 unitTyConEnv x y = unitUFM x y
85 extendTyConEnv x y z = addToUFM x y z
86 extendTyConEnvList x l = addListToUFM x l
87 lookupTyConEnv x y = lookupUFM x y
88 alterTyConEnv = alterUFM
89 mkTyConEnv l = listToUFM l
90 mkTyConEnvWith f = mkTyConEnv . map (\a -> (f a, a))
91 elemTyConEnv x y = elemUFM x y
92 plusTyConEnv x y = plusUFM x y
93 plusTyConEnv_C f x y = plusUFM_C f x y
94 plusTyConEnv_CD f x d y b = plusUFM_CD f x d y b
95 plusTyConEnv_CD2 f x y = plusUFM_CD2 f x y
96 extendTyConEnv_C f x y z = addToUFM_C f x y z
97 mapTyConEnv f x = mapUFM f x
98 extendTyConEnv_Acc x y z a b = addToUFM_Acc x y z a b
99 extendTyConEnvList_C x y z = addListToUFM_C x y z
100 delFromTyConEnv x y = delFromUFM x y
101 delListFromTyConEnv x y = delListFromUFM x y
102 filterTyConEnv x y = filterUFM x y
103 anyTyConEnv f x = foldUFM ((||) . f) False x
104 disjointTyConEnv x y = disjointUFM x y
105
106 lookupTyConEnv_NF env n = expectJust "lookupTyConEnv_NF" (lookupTyConEnv env n)
107
108 -- | Deterministic TyCon Environment
109 --
110 -- See Note [Deterministic UniqFM] in "GHC.Types.Unique.DFM" for explanation why
111 -- we need DTyConEnv.
112 type DTyConEnv a = UniqDFM TyCon a
113
114 emptyDTyConEnv :: DTyConEnv a
115 emptyDTyConEnv = emptyUDFM
116
117 isEmptyDTyConEnv :: DTyConEnv a -> Bool
118 isEmptyDTyConEnv = isNullUDFM
119
120 lookupDTyConEnv :: DTyConEnv a -> TyCon -> Maybe a
121 lookupDTyConEnv = lookupUDFM
122
123 delFromDTyConEnv :: DTyConEnv a -> TyCon -> DTyConEnv a
124 delFromDTyConEnv = delFromUDFM
125
126 filterDTyConEnv :: (a -> Bool) -> DTyConEnv a -> DTyConEnv a
127 filterDTyConEnv = filterUDFM
128
129 mapDTyConEnv :: (a -> b) -> DTyConEnv a -> DTyConEnv b
130 mapDTyConEnv = mapUDFM
131
132 mapMaybeDTyConEnv :: (a -> Maybe b) -> DTyConEnv a -> DTyConEnv b
133 mapMaybeDTyConEnv = mapMaybeUDFM
134
135 adjustDTyConEnv :: (a -> a) -> DTyConEnv a -> TyCon -> DTyConEnv a
136 adjustDTyConEnv = adjustUDFM
137
138 alterDTyConEnv :: (Maybe a -> Maybe a) -> DTyConEnv a -> TyCon -> DTyConEnv a
139 alterDTyConEnv = alterUDFM
140
141 extendDTyConEnv :: DTyConEnv a -> TyCon -> a -> DTyConEnv a
142 extendDTyConEnv = addToUDFM
143
144 foldDTyConEnv :: (elt -> a -> a) -> a -> DTyConEnv elt -> a
145 foldDTyConEnv = foldUDFM