fix haddock submodule pointer
[ghc-hetmet.git] / compiler / basicTypes / VarSet.lhs
index 55e82a8..e0ff52d 100644 (file)
@@ -1,28 +1,30 @@
 %
+% (c) The University of Glasgow 2006
 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
 %
-\section{@VarSet@: Variable sets}
 
 \begin{code}
 module VarSet (
-       VarSet, IdSet, TyVarSet,
+        -- * Var, Id and TyVar set types
+       VarSet, IdSet, TyVarSet, TyCoVarSet, CoVarSet,
+       
+       -- ** Manipulating these sets
        emptyVarSet, unitVarSet, mkVarSet,
        extendVarSet, extendVarSetList, extendVarSet_C,
        elemVarSet, varSetElems, subVarSet,
        unionVarSet, unionVarSets,
-       intersectVarSet, intersectsVarSet,
+       intersectVarSet, intersectsVarSet, disjointVarSet,
        isEmptyVarSet, delVarSet, delVarSetList, delVarSetByKey,
-       minusVarSet, foldVarSet, filterVarSet,
+       minusVarSet, foldVarSet, filterVarSet, fixVarSet,
        lookupVarSet, mapVarSet, sizeVarSet, seqVarSet,
        elemVarSetByKey
     ) where
 
 #include "HsVersions.h"
 
-import Var             ( Var, Id, TyVar )
-import Unique          ( Unique )
+import Var      ( Var, TyVar, CoVar, TyCoVar, Id )
+import Unique
 import UniqSet
-import UniqFM          ( delFromUFM_Directly, addToUFM_C )
 \end{code}
 
 %************************************************************************
@@ -35,6 +37,8 @@ import UniqFM         ( delFromUFM_Directly, addToUFM_C )
 type VarSet       = UniqSet Var
 type IdSet       = UniqSet Id
 type TyVarSet    = UniqSet TyVar
+type TyCoVarSet   = UniqSet TyCoVar
+type CoVarSet     = UniqSet CoVar
 
 emptyVarSet    :: VarSet
 intersectVarSet        :: VarSet -> VarSet -> VarSet
@@ -61,6 +65,7 @@ extendVarSet_C  :: (Var->Var->Var) -> VarSet -> Var -> VarSet
 
 delVarSetByKey :: VarSet -> Unique -> VarSet
 elemVarSetByKey :: Unique -> VarSet -> Bool
+fixVarSet       :: (VarSet -> VarSet) -> VarSet -> VarSet
 
 emptyVarSet    = emptyUniqSet
 unitVarSet     = unitUniqSet
@@ -69,9 +74,10 @@ extendVarSetList= addListToUniqSet
 intersectVarSet        = intersectUniqSets
 
 intersectsVarSet:: VarSet -> VarSet -> Bool    -- True if non-empty intersection
-       -- (s1 `intersectsVarSet` s2) doesn't compute s2 if s1 is empty
+disjointVarSet  :: VarSet -> VarSet -> Bool    -- True if empty intersection
 subVarSet      :: VarSet -> VarSet -> Bool     -- True if first arg is subset of second
-       -- (s1 `subVarSet` s2) doesn't compute s2 if s1 is empty
+       -- (s1 `intersectsVarSet` s2) doesn't compute s2 if s1 is empty; 
+       -- ditto disjointVarSet, subVarSet
 
 unionVarSet    = unionUniqSets
 unionVarSets   = unionManyUniqSets
@@ -87,15 +93,22 @@ lookupVarSet        = lookupUniqSet
 mapVarSet      = mapUniqSet
 sizeVarSet     = sizeUniqSet
 filterVarSet   = filterUniqSet
-extendVarSet_C combine s x = addToUFM_C combine s x x
-delVarSetByKey = delFromUFM_Directly   -- Can't be bothered to add this to UniqSet
+extendVarSet_C = addOneToUniqSet_C
+delVarSetByKey = delOneFromUniqSet_Directly
 elemVarSetByKey        = elemUniqSet_Directly
 \end{code}
 
 \begin{code}
 -- See comments with type signatures
-intersectsVarSet s1 s2 = not (isEmptyVarSet (s1 `intersectVarSet` s2))
-a `subVarSet` b = isEmptyVarSet (a `minusVarSet` b)
+intersectsVarSet s1 s2 = not (s1 `disjointVarSet` s2)
+disjointVarSet   s1 s2 = isEmptyVarSet (s1 `intersectVarSet` s2)
+subVarSet        s1 s2 = isEmptyVarSet (s1 `minusVarSet` s2)
+
+-- Iterate f to a fixpoint
+fixVarSet f s | new_s `subVarSet` s = s
+             | otherwise           = fixVarSet f new_s 
+             where
+               new_s = f s
 \end{code}
 
 \begin{code}