2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section{@VarSet@: Variable sets}
8 VarSet, IdSet, TyVarSet, IdOrTyVarSet, UVarSet,
9 emptyVarSet, unitVarSet, mkVarSet,
11 elemVarSet, varSetElems, subVarSet,
12 unionVarSet, unionVarSets,
13 intersectVarSet, intersectsVarSet,
14 isEmptyVarSet, delVarSet, delVarSetByKey,
15 minusVarSet, foldVarSet, filterVarSet,
16 lookupVarSet, mapVarSet, sizeVarSet, seqVarSet,
21 #include "HsVersions.h"
23 import CmdLineOpts ( opt_PprStyle_Debug )
24 import Var ( Var, Id, TyVar, UVar, IdOrTyVar, setVarUnique )
25 import Unique ( Unique, Uniquable(..), incrUnique, deriveUnique )
27 import UniqFM ( delFromUFM_Directly )
31 %************************************************************************
33 \subsection{@VarSet@s}
35 %************************************************************************
38 type VarSet = UniqSet Var
39 type IdSet = UniqSet Id
40 type TyVarSet = UniqSet TyVar
41 type IdOrTyVarSet = UniqSet IdOrTyVar
42 type UVarSet = UniqSet UVar
45 intersectVarSet :: VarSet -> VarSet -> VarSet
46 intersectsVarSet:: VarSet -> VarSet -> Bool -- True if non-empty intersection
47 unionVarSet :: VarSet -> VarSet -> VarSet
48 unionVarSets :: [VarSet] -> VarSet
49 varSetElems :: VarSet -> [Var]
50 unitVarSet :: Var -> VarSet
51 extendVarSet :: VarSet -> Var -> VarSet
52 elemVarSet :: Var -> VarSet -> Bool
53 delVarSet :: VarSet -> Var -> VarSet
54 minusVarSet :: VarSet -> VarSet -> VarSet
55 isEmptyVarSet :: VarSet -> Bool
56 mkVarSet :: [Var] -> VarSet
57 foldVarSet :: (Var -> a -> a) -> a -> VarSet -> a
58 lookupVarSet :: VarSet -> Var -> Maybe Var
59 -- Returns the set element, which may be
60 -- (==) to the argument, but not the same as
61 mapVarSet :: (Var -> Var) -> VarSet -> VarSet
62 sizeVarSet :: VarSet -> Int
63 filterVarSet :: (Var -> Bool) -> VarSet -> VarSet
64 subVarSet :: VarSet -> VarSet -> Bool
66 delVarSetByKey :: VarSet -> Unique -> VarSet
68 emptyVarSet = emptyUniqSet
69 unitVarSet = unitUniqSet
70 extendVarSet = addOneToUniqSet
71 intersectVarSet = intersectUniqSets
72 intersectsVarSet s1 s2 = not (isEmptyVarSet (s1 `intersectVarSet` s2))
73 unionVarSet = unionUniqSets
74 unionVarSets = unionManyUniqSets
75 varSetElems = uniqSetToList
76 elemVarSet = elementOfUniqSet
77 minusVarSet = minusUniqSet
78 delVarSet = delOneFromUniqSet
79 isEmptyVarSet = isEmptyUniqSet
81 foldVarSet = foldUniqSet
82 lookupVarSet = lookupUniqSet
83 mapVarSet = mapUniqSet
84 sizeVarSet = sizeUniqSet
85 filterVarSet = filterUniqSet
86 a `subVarSet` b = isEmptyVarSet (a `minusVarSet` b)
87 delVarSetByKey = delFromUFM_Directly -- Can't be bothered to add this to UniqSet
91 seqVarSet :: VarSet -> ()
92 seqVarSet s = sizeVarSet s `seq` ()
96 uniqAway :: VarSet -> Var -> Var
97 -- Give the Var a new unique, different to any in the VarSet
99 | not (var `elemVarSet` set) = var -- Nothing to do
102 = try 1 (deriveUnique (getUnique var) (hashUniqSet set))
104 try n uniq | uniq `elemUniqSet_Directly` set = try ((n+1)::Int) (incrUnique uniq)
106 | opt_PprStyle_Debug && n > 3
107 = pprTrace "uniqAway:" (ppr n <+> text "tries" <+> ppr var)
108 setVarUnique var uniq
110 | otherwise = setVarUnique var uniq