[project @ 2000-03-23 17:45:17 by simonpj]
[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, UVarSet,
9         emptyVarSet, unitVarSet, mkVarSet,
10         extendVarSet,
11         elemVarSet, varSetElems, subVarSet,
12         unionVarSet, unionVarSets,
13         intersectVarSet, intersectsVarSet,
14         isEmptyVarSet, delVarSet, delVarSetByKey,
15         minusVarSet, foldVarSet, filterVarSet,
16         lookupVarSet, mapVarSet, sizeVarSet, seqVarSet,
17
18         uniqAway
19     ) where
20
21 #include "HsVersions.h"
22
23 import CmdLineOpts      ( opt_PprStyle_Debug )
24 import Var              ( Var, Id, TyVar, UVar, setVarUnique )
25 import Unique           ( Unique, Uniquable(..), incrUnique, deriveUnique )
26 import UniqSet
27 import UniqFM           ( delFromUFM_Directly )
28 import Outputable
29 \end{code}
30
31 %************************************************************************
32 %*                                                                      *
33 \subsection{@VarSet@s}
34 %*                                                                      *
35 %************************************************************************
36
37 \begin{code}
38 type VarSet       = UniqSet Var
39 type IdSet        = UniqSet Id
40 type TyVarSet     = UniqSet TyVar
41 type UVarSet      = UniqSet UVar
42
43 emptyVarSet     :: VarSet
44 intersectVarSet :: VarSet -> VarSet -> VarSet
45 intersectsVarSet:: VarSet -> VarSet -> Bool     -- True if non-empty intersection
46 unionVarSet     :: VarSet -> VarSet -> VarSet
47 unionVarSets    :: [VarSet] -> VarSet
48 varSetElems     :: VarSet -> [Var]
49 unitVarSet      :: Var -> VarSet
50 extendVarSet    :: VarSet -> Var -> VarSet
51 elemVarSet      :: Var -> VarSet -> Bool
52 delVarSet       :: VarSet -> Var -> VarSet
53 minusVarSet     :: VarSet -> VarSet -> VarSet
54 isEmptyVarSet   :: VarSet -> Bool
55 mkVarSet        :: [Var] -> VarSet
56 foldVarSet      :: (Var -> a -> a) -> a -> VarSet -> a
57 lookupVarSet    :: VarSet -> Var -> Maybe Var
58                         -- Returns the set element, which may be
59                         -- (==) to the argument, but not the same as
60 mapVarSet       :: (Var -> Var) -> VarSet -> VarSet
61 sizeVarSet      :: VarSet -> Int
62 filterVarSet    :: (Var -> Bool) -> VarSet -> VarSet
63 subVarSet       :: VarSet -> VarSet -> Bool
64
65 delVarSetByKey  :: VarSet -> Unique -> VarSet
66
67 emptyVarSet     = emptyUniqSet
68 unitVarSet      = unitUniqSet
69 extendVarSet    = addOneToUniqSet
70 intersectVarSet = intersectUniqSets
71 intersectsVarSet s1 s2 = not (isEmptyVarSet (s1 `intersectVarSet` s2))
72 unionVarSet     = unionUniqSets
73 unionVarSets    = unionManyUniqSets
74 varSetElems     = uniqSetToList
75 elemVarSet      = elementOfUniqSet
76 minusVarSet     = minusUniqSet
77 delVarSet       = delOneFromUniqSet
78 isEmptyVarSet   = isEmptyUniqSet
79 mkVarSet        = mkUniqSet
80 foldVarSet      = foldUniqSet
81 lookupVarSet    = lookupUniqSet
82 mapVarSet       = mapUniqSet
83 sizeVarSet      = sizeUniqSet
84 filterVarSet    = filterUniqSet
85 a `subVarSet` b = isEmptyVarSet (a `minusVarSet` b)
86 delVarSetByKey  = delFromUFM_Directly   -- Can't be bothered to add this to UniqSet
87 \end{code}
88
89 \begin{code}
90 seqVarSet :: VarSet -> ()
91 seqVarSet s = sizeVarSet s `seq` ()
92 \end{code}
93
94 \begin{code}
95 uniqAway :: VarSet -> Var -> Var
96 -- Give the Var a new unique, different to any in the VarSet
97 uniqAway set var
98   | not (var `elemVarSet` set) = var    -- Nothing to do
99
100   | otherwise
101   = try 1 (deriveUnique (getUnique var) (hashUniqSet set))
102   where
103     try n uniq | uniq `elemUniqSet_Directly` set = try ((n+1)::Int) (incrUnique uniq)
104 #ifdef DEBUG
105                | opt_PprStyle_Debug && n > 3
106                = pprTrace "uniqAway:" (ppr n <+> text "tries" <+> ppr var) 
107                  setVarUnique var uniq
108 #endif                      
109                | otherwise = setVarUnique var uniq
110 \end{code}