2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section{@VarSet@: Variable sets}
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
19 #include "HsVersions.h"
21 import Var ( Var, Id, TyVar )
22 import Unique ( Unique )
24 import UniqFM ( delFromUFM_Directly, addToUFM_C )
27 %************************************************************************
29 \subsection{@VarSet@s}
31 %************************************************************************
34 type VarSet = UniqSet Var
35 type IdSet = UniqSet Id
36 type TyVarSet = UniqSet TyVar
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
60 delVarSetByKey :: VarSet -> Unique -> VarSet
62 emptyVarSet = emptyUniqSet
63 unitVarSet = unitUniqSet
64 extendVarSet = addOneToUniqSet
65 intersectVarSet = intersectUniqSets
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
72 unionVarSet = unionUniqSets
73 unionVarSets = unionManyUniqSets
74 varSetElems = uniqSetToList
75 elemVarSet = elementOfUniqSet
76 minusVarSet = minusUniqSet
77 delVarSet = delOneFromUniqSet
78 delVarSetList = delListFromUniqSet
79 isEmptyVarSet = isEmptyUniqSet
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
91 -- See comments with type signatures
92 intersectsVarSet s1 s2 = not (isEmptyVarSet (s1 `intersectVarSet` s2))
93 a `subVarSet` b = isEmptyVarSet (a `minusVarSet` b)
97 seqVarSet :: VarSet -> ()
98 seqVarSet s = sizeVarSet s `seq` ()