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