[project @ 1999-01-15 14:06:50 by simonm]
[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, IdOrTyVarSet,
9         emptyVarSet, unitVarSet, mkVarSet,
10         extendVarSet,
11         elemVarSet, varSetElems,
12         unionVarSet, unionVarSets,
13         intersectVarSet, intersectsVarSet,
14         isEmptyVarSet, delVarSet,
15         minusVarSet, foldVarSet, filterVarSet,
16         lookupVarSet, mapVarSet,
17
18         uniqAway
19     ) where
20
21 #include "HsVersions.h"
22
23 import Var              ( Var, Id, TyVar, IdOrTyVar, setVarUnique )
24 import Unique           ( Uniquable(..), incrUnique )
25 import UniqSet
26 import Outputable
27 \end{code}
28
29 %************************************************************************
30 %*                                                                      *
31 \subsection{@VarSet@s}
32 %*                                                                      *
33 %************************************************************************
34
35 \begin{code}
36 type VarSet       = UniqSet Var
37 type IdSet        = UniqSet Id
38 type TyVarSet     = UniqSet TyVar
39 type IdOrTyVarSet = UniqSet IdOrTyVar
40
41 emptyVarSet     :: VarSet
42 intersectVarSet :: VarSet -> VarSet -> VarSet
43 intersectsVarSet:: VarSet -> VarSet -> Bool     -- True if non-empty intersection
44 unionVarSet     :: VarSet -> VarSet -> VarSet
45 unionVarSets    :: [VarSet] -> VarSet
46 varSetElems     :: VarSet -> [Var]
47 unitVarSet      :: Var -> VarSet
48 extendVarSet    :: VarSet -> Var -> VarSet
49 elemVarSet      :: Var -> VarSet -> Bool
50 delVarSet       :: VarSet -> Var -> VarSet
51 minusVarSet     :: VarSet -> VarSet -> VarSet
52 isEmptyVarSet   :: VarSet -> Bool
53 mkVarSet        :: [Var] -> VarSet
54 foldVarSet      :: (Var -> a -> a) -> a -> VarSet -> a
55 lookupVarSet    :: VarSet -> Var -> Maybe Var
56                         -- Returns the set element, which may be
57                         -- (==) to the argument, but not the same as
58 mapVarSet       :: (Var -> Var) -> VarSet -> VarSet
59 filterVarSet    :: (Var -> Bool) -> VarSet -> VarSet
60
61 emptyVarSet     = emptyUniqSet
62 unitVarSet      = unitUniqSet
63 extendVarSet    = addOneToUniqSet
64 intersectVarSet = intersectUniqSets
65 intersectsVarSet s1 s2 = not (isEmptyVarSet (s1 `intersectVarSet` s2))
66 unionVarSet     = unionUniqSets
67 unionVarSets    = unionManyUniqSets
68 varSetElems     = uniqSetToList
69 elemVarSet      = elementOfUniqSet
70 minusVarSet     = minusUniqSet
71 delVarSet       = delOneFromUniqSet
72 isEmptyVarSet   = isEmptyUniqSet
73 mkVarSet        = mkUniqSet
74 foldVarSet      = foldUniqSet
75 lookupVarSet    = lookupUniqSet
76 mapVarSet       = mapUniqSet
77 filterVarSet    = filterUniqSet
78 \end{code}
79
80 \begin{code}
81 uniqAway :: VarSet -> Var -> Var
82 -- Give the Var a new unique, different to any in the VarSet
83 uniqAway set var
84   = try 1 (incrUnique (getUnique var))
85   where
86     try n uniq | uniq `elemUniqSet_Directly` set = try ((n+1)::Int) (incrUnique uniq)
87                | otherwise = {- pprTrace "uniqAway:" (ppr n <+> text "tries") -}
88                              setVarUnique var uniq
89 \end{code}