6f03aad1bf05c1ce4c051fee1688969a98d166e5
[ghc-hetmet.git] / compiler / basicTypes / VarSet.lhs
1 %
2 % (c) The University of Glasgow 2006
3 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 %
5
6 \begin{code}
7 module VarSet (
8         -- * Var, Id and TyVar set types
9         VarSet, IdSet, TyVarSet,
10         
11         -- ** Manipulating these sets
12         emptyVarSet, unitVarSet, mkVarSet,
13         extendVarSet, extendVarSetList, extendVarSet_C,
14         elemVarSet, varSetElems, subVarSet,
15         unionVarSet, unionVarSets,
16         intersectVarSet, intersectsVarSet, disjointVarSet,
17         isEmptyVarSet, delVarSet, delVarSetList, delVarSetByKey,
18         minusVarSet, foldVarSet, filterVarSet, fixVarSet,
19         lookupVarSet, mapVarSet, sizeVarSet, seqVarSet,
20         elemVarSetByKey
21     ) where
22
23 #include "HsVersions.h"
24
25 import Var      ( Var, TyVar, Id )
26 import Unique
27 import UniqSet
28 \end{code}
29
30 %************************************************************************
31 %*                                                                      *
32 \subsection{@VarSet@s}
33 %*                                                                      *
34 %************************************************************************
35
36 \begin{code}
37 type VarSet       = UniqSet Var
38 type IdSet        = UniqSet Id
39 type TyVarSet     = UniqSet TyVar
40
41 emptyVarSet     :: VarSet
42 intersectVarSet :: VarSet -> VarSet -> VarSet
43 unionVarSet     :: VarSet -> VarSet -> VarSet
44 unionVarSets    :: [VarSet] -> VarSet
45 varSetElems     :: VarSet -> [Var]
46 unitVarSet      :: Var -> VarSet
47 extendVarSet    :: VarSet -> Var -> VarSet
48 extendVarSetList:: VarSet -> [Var] -> VarSet
49 elemVarSet      :: Var -> VarSet -> Bool
50 delVarSet       :: VarSet -> Var -> VarSet
51 delVarSetList   :: VarSet -> [Var] -> VarSet
52 minusVarSet     :: VarSet -> VarSet -> VarSet
53 isEmptyVarSet   :: VarSet -> Bool
54 mkVarSet        :: [Var] -> VarSet
55 foldVarSet      :: (Var -> a -> a) -> a -> VarSet -> a
56 lookupVarSet    :: VarSet -> Var -> Maybe Var
57                         -- Returns the set element, which may be
58                         -- (==) to the argument, but not the same as
59 mapVarSet       :: (Var -> Var) -> VarSet -> VarSet
60 sizeVarSet      :: VarSet -> Int
61 filterVarSet    :: (Var -> Bool) -> VarSet -> VarSet
62 extendVarSet_C  :: (Var->Var->Var) -> VarSet -> Var -> VarSet
63
64 delVarSetByKey  :: VarSet -> Unique -> VarSet
65 elemVarSetByKey :: Unique -> VarSet -> Bool
66 fixVarSet       :: (VarSet -> VarSet) -> VarSet -> VarSet
67
68 emptyVarSet     = emptyUniqSet
69 unitVarSet      = unitUniqSet
70 extendVarSet    = addOneToUniqSet
71 extendVarSetList= addListToUniqSet
72 intersectVarSet = intersectUniqSets
73
74 intersectsVarSet:: VarSet -> VarSet -> Bool     -- True if non-empty intersection
75 disjointVarSet  :: VarSet -> VarSet -> Bool     -- True if empty intersection
76 subVarSet       :: VarSet -> VarSet -> Bool     -- True if first arg is subset of second
77         -- (s1 `intersectsVarSet` s2) doesn't compute s2 if s1 is empty; 
78         -- ditto disjointVarSet, subVarSet
79
80 unionVarSet     = unionUniqSets
81 unionVarSets    = unionManyUniqSets
82 varSetElems     = uniqSetToList
83 elemVarSet      = elementOfUniqSet
84 minusVarSet     = minusUniqSet
85 delVarSet       = delOneFromUniqSet
86 delVarSetList   = delListFromUniqSet
87 isEmptyVarSet   = isEmptyUniqSet
88 mkVarSet        = mkUniqSet
89 foldVarSet      = foldUniqSet
90 lookupVarSet    = lookupUniqSet
91 mapVarSet       = mapUniqSet
92 sizeVarSet      = sizeUniqSet
93 filterVarSet    = filterUniqSet
94 extendVarSet_C = addOneToUniqSet_C
95 delVarSetByKey  = delOneFromUniqSet_Directly
96 elemVarSetByKey = elemUniqSet_Directly
97 \end{code}
98
99 \begin{code}
100 -- See comments with type signatures
101 intersectsVarSet s1 s2 = not (s1 `disjointVarSet` s2)
102 disjointVarSet   s1 s2 = isEmptyVarSet (s1 `intersectVarSet` s2)
103 subVarSet        s1 s2 = isEmptyVarSet (s1 `minusVarSet` s2)
104
105 -- Iterate f to a fixpoint
106 fixVarSet f s | new_s `subVarSet` s = s
107               | otherwise           = fixVarSet f new_s 
108               where
109                 new_s = f s
110 \end{code}
111
112 \begin{code}
113 seqVarSet :: VarSet -> ()
114 seqVarSet s = sizeVarSet s `seq` ()
115 \end{code}
116