%
-% (c) The AQUA Project, Glasgow University, 1994-1996
+% (c) The AQUA Project, Glasgow University, 1994-1998
%
\section[UniqSet]{Specialised sets, for things with @Uniques@}
Basically, the things need to be in class @Uniquable@.
\begin{code}
-#include "HsVersions.h"
-
module UniqSet (
- UniqSet(..), -- abstract type: NOT
+ UniqSet, -- abstract type: NOT
mkUniqSet, uniqSetToList, emptyUniqSet, unitUniqSet,
- addOneToUniqSet,
+ addOneToUniqSet, addListToUniqSet, delOneFromUniqSet, delListFromUniqSet,
unionUniqSets, unionManyUniqSets, minusUniqSet,
elementOfUniqSet, mapUniqSet, intersectUniqSets,
- isEmptyUniqSet
+ isEmptyUniqSet, filterUniqSet, sizeUniqSet, foldUniqSet,
+ elemUniqSet_Directly, lookupUniqSet, hashUniqSet
) where
-import Ubiq{-uitous-}
+#include "HsVersions.h"
-import Maybes ( maybeToBool, Maybe )
+import {-# SOURCE #-} Name ( Name )
+
+import Maybes ( maybeToBool )
import UniqFM
-import Unique ( Unique )
---import Outputable ( Outputable(..), ExportFlag )
-import SrcLoc ( SrcLoc )
-import Pretty ( Pretty(..), PrettyRep )
-import PprStyle ( PprStyle )
-import Util ( Ord3(..) )
+import Unique ( Unique, Uniquable(..) )
#if ! OMIT_NATIVE_CODEGEN
#define IF_NCG(a) a
%* *
%************************************************************************
-We use @UniqFM@, with a (@uniqueOf@-able) @Unique@ as ``key''
+We use @UniqFM@, with a (@getUnique@-able) @Unique@ as ``key''
and the thing itself as the ``value'' (for later retrieval).
\begin{code}
uniqSetToList :: UniqSet a -> [a]
uniqSetToList (MkUniqSet set) = eltsUFM set
+foldUniqSet :: (a -> b -> b) -> b -> UniqSet a -> b
+foldUniqSet k z (MkUniqSet set) = foldUFM k z set
+
mkUniqSet :: Uniquable a => [a] -> UniqSet a
mkUniqSet xs = MkUniqSet (listToUFM [ (x, x) | x <- xs])
addOneToUniqSet :: Uniquable a => UniqSet a -> a -> UniqSet a
-addOneToUniqSet set x = set `unionUniqSets` unitUniqSet x
+addOneToUniqSet (MkUniqSet set) x = MkUniqSet (addToUFM set x x)
+
+delOneFromUniqSet :: Uniquable a => UniqSet a -> a -> UniqSet a
+delOneFromUniqSet (MkUniqSet set) x = MkUniqSet (delFromUFM set x)
+
+delListFromUniqSet :: Uniquable a => UniqSet a -> [a] -> UniqSet a
+delListFromUniqSet (MkUniqSet set) xs = MkUniqSet (delListFromUFM set xs)
+
+addListToUniqSet :: Uniquable a => UniqSet a -> [a] -> UniqSet a
+addListToUniqSet (MkUniqSet set) xs = MkUniqSet (addListToUFM set [(x,x) | x<-xs])
unionUniqSets :: UniqSet a -> UniqSet a -> UniqSet a
unionUniqSets (MkUniqSet set1) (MkUniqSet set2) = MkUniqSet (plusUFM set1 set2)
minusUniqSet :: UniqSet a -> UniqSet a -> UniqSet a
minusUniqSet (MkUniqSet set1) (MkUniqSet set2) = MkUniqSet (minusUFM set1 set2)
+filterUniqSet :: (a -> Bool) -> UniqSet a -> UniqSet a
+filterUniqSet pred (MkUniqSet set) = MkUniqSet (filterUFM pred set)
+
intersectUniqSets :: UniqSet a -> UniqSet a -> UniqSet a
intersectUniqSets (MkUniqSet set1) (MkUniqSet set2) = MkUniqSet (intersectUFM set1 set2)
elementOfUniqSet :: Uniquable a => a -> UniqSet a -> Bool
elementOfUniqSet x (MkUniqSet set) = maybeToBool (lookupUFM set x)
-isEmptyUniqSet :: UniqSet a -> Bool
-isEmptyUniqSet (MkUniqSet set) = isNullUFM set {-SLOW: sizeUFM set == 0-}
+lookupUniqSet :: Uniquable a => UniqSet a -> a -> Maybe a
+lookupUniqSet (MkUniqSet set) x = lookupUFM set x
-mapUniqSet :: Uniquable b => (a -> b) -> UniqSet a -> UniqSet b
-mapUniqSet f (MkUniqSet set)
- = MkUniqSet (listToUFM [ let
- mapped_thing = f thing
- in
- (mapped_thing, mapped_thing)
- | thing <- eltsUFM set ])
-\end{code}
+elemUniqSet_Directly :: Unique -> UniqSet a -> Bool
+elemUniqSet_Directly x (MkUniqSet set) = maybeToBool (lookupUFM_Directly set x)
-%************************************************************************
-%* *
-\subsection{The @IdSet@ and @TyVarSet@ specialisations for sets of Ids/TyVars}
-%* *
-%************************************************************************
+sizeUniqSet :: UniqSet a -> Int
+sizeUniqSet (MkUniqSet set) = sizeUFM set
-@IdSet@ is a specialised version, optimised for sets of Ids.
+hashUniqSet :: UniqSet a -> Int
+hashUniqSet (MkUniqSet set) = hashUFM set
-\begin{code}
---type NameSet = UniqSet Name
---type GenTyVarSet flexi = UniqSet (GenTyVar flexi)
---type GenIdSet ty = UniqSet (GenId ty)
+isEmptyUniqSet :: UniqSet a -> Bool
+isEmptyUniqSet (MkUniqSet set) = isNullUFM set {-SLOW: sizeUFM set == 0-}
-#if ! OMIT_NATIVE_CODEGEN
---type RegSet = UniqSet Reg
-#endif
+mapUniqSet :: (a -> a) -> UniqSet a -> UniqSet a
+ -- VERY IMPORTANT: *assumes* that the function doesn't change the unique
+mapUniqSet f (MkUniqSet set) = MkUniqSet (mapUFM f set)
+\end{code}
-#if 0
+\begin{code}
#if __GLASGOW_HASKELL__
{-# SPECIALIZE
- unitUniqSet :: GenId ty -> GenIdSet ty,
- GenTyVar flexi -> GenTyVarSet flexi,
- Name -> NameSet
- IF_NCG(COMMA Reg -> RegSet)
- #-}
-
-{-# SPECIALIZE
- mkUniqSet :: [GenId ty] -> GenIdSet ty,
- [GenTyVar flexi] -> GenTyVarSet flexi,
- [Name] -> NameSet
- IF_NCG(COMMA [Reg] -> RegSet)
- #-}
-
-{-# SPECIALIZE
- elementOfUniqSet :: GenId ty -> GenIdSet ty -> Bool,
- GenTyVar flexi -> GenTyVarSet flexi -> Bool,
- Name -> NameSet -> Bool
- IF_NCG(COMMA Reg -> RegSet -> Bool)
+ addOneToUniqSet :: UniqSet Unique -> Unique -> UniqSet Unique
#-}
-
-{-# SPECIALIZE
- mapUniqSet :: (GenId ty -> GenId ty) -> GenIdSet ty -> GenIdSet ty,
- (GenTyVar flexi -> GenTyVar flexi) -> GenTyVarSet flexi -> GenTyVarSet flexi,
- (Name -> Name) -> NameSet -> NameSet
- IF_NCG(COMMA (Reg -> Reg) -> RegSet -> RegSet)
- #-}
-#endif
+{- SPECIALIZE
+ elementOfUniqSet :: Name -> UniqSet Name -> Bool
+ , Unique -> UniqSet Unique -> Bool
+ -}
+{- SPECIALIZE
+ mkUniqSet :: [Name] -> UniqSet Name
+ -}
+
+{- SPECIALIZE
+ unitUniqSet :: Name -> UniqSet Name
+ , Unique -> UniqSet Unique
+ -}
#endif
\end{code}