[project @ 1998-12-02 13:17:09 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, GenIdSet, TyVarSet, GenTyVarSet, 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, GenId, TyVar, GenTyVar, 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 fs ft      = UniqSet (Var fs ft)
37 type IdSet             = UniqSet Id
38 type GenIdSet flexi    = UniqSet (GenId flexi)
39 type TyVarSet          = UniqSet TyVar
40 type GenTyVarSet flexi = UniqSet (GenTyVar flexi)
41 type IdOrTyVarSet      = UniqSet IdOrTyVar
42
43 emptyVarSet     :: VarSet fs ft
44 intersectVarSet :: VarSet fs ft -> VarSet fs ft -> VarSet fs ft
45 intersectsVarSet:: VarSet fs ft -> VarSet fs ft -> Bool         -- True if non-empty intersection
46 unionVarSet     :: VarSet fs ft -> VarSet fs ft -> VarSet fs ft
47 unionVarSets    :: [VarSet fs ft] -> VarSet fs ft
48 varSetElems     :: VarSet fs ft -> [Var fs ft]
49 unitVarSet      :: Var fs ft -> VarSet fs ft
50 extendVarSet    :: VarSet fs ft -> Var fs ft -> VarSet fs ft
51 elemVarSet      :: Var fs ft -> VarSet fs ft -> Bool
52 delVarSet       :: VarSet fs ft -> Var fs ft -> VarSet fs ft
53 minusVarSet     :: VarSet fs ft -> VarSet fs ft -> VarSet fs ft
54 isEmptyVarSet   :: VarSet fs ft -> Bool
55 mkVarSet        :: [Var fs ft] -> VarSet fs ft
56 foldVarSet      :: (Var fs ft -> a -> a) -> a -> VarSet fs ft -> a
57 lookupVarSet    :: VarSet fs ft -> Var fs ft -> Maybe (Var fs ft)
58                         -- Returns the set element, which may be
59                         -- (==) to the argument, but not the same as
60 mapVarSet       :: (Var fs ft -> Var fs ft) -> VarSet fs ft -> VarSet fs ft
61 filterVarSet    :: (Var fs ft -> Bool) -> VarSet fs ft -> VarSet fs ft
62
63 emptyVarSet     = emptyUniqSet
64 unitVarSet      = unitUniqSet
65 extendVarSet    = addOneToUniqSet
66 intersectVarSet = intersectUniqSets
67 intersectsVarSet s1 s2 = not (isEmptyVarSet (s1 `intersectVarSet` s2))
68 unionVarSet     = unionUniqSets
69 unionVarSets    = unionManyUniqSets
70 varSetElems     = uniqSetToList
71 elemVarSet      = elementOfUniqSet
72 minusVarSet     = minusUniqSet
73 delVarSet       = delOneFromUniqSet
74 isEmptyVarSet   = isEmptyUniqSet
75 mkVarSet        = mkUniqSet
76 foldVarSet      = foldUniqSet
77 lookupVarSet    = lookupUniqSet
78 mapVarSet       = mapUniqSet
79 filterVarSet    = filterUniqSet
80 \end{code}
81
82 \begin{code}
83 uniqAway :: VarSet fs ft -> Var fs ft -> Var fs ft
84 -- Give the Var a new unique, different to any in the VarSet
85 uniqAway set var
86   = try 1 (incrUnique (getUnique var))
87   where
88     try n uniq | uniq `elemUniqSet_Directly` set = try ((n+1)::Int) (incrUnique uniq)
89                | otherwise = {- pprTrace "uniqAway:" (ppr n <+> text "tries") -}
90                              setVarUnique var uniq
91 \end{code}