X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Futils%2FBag.lhs;h=b2be2c30db697b411231bb63a28b39dfe1741c65;hb=63dde2e3cb89839f7375363bde31fabdcddb1462;hp=e53d23dc0cfd8083c4e2de73279592728e9e41aa;hpb=e4cdbb7b821b1ee6dfb0d7a5ef7275edab6a0520;p=ghc-hetmet.git diff --git a/compiler/utils/Bag.lhs b/compiler/utils/Bag.lhs index e53d23d..b2be2c3 100644 --- a/compiler/utils/Bag.lhs +++ b/compiler/utils/Bag.lhs @@ -11,17 +11,23 @@ module Bag ( emptyBag, unitBag, unionBags, unionManyBags, mapBag, - elemBag, + elemBag, lengthBag, filterBag, partitionBag, concatBag, foldBag, foldrBag, foldlBag, isEmptyBag, isSingletonBag, consBag, snocBag, anyBag, listToBag, bagToList, mapBagM, mapAndUnzipBagM ) where +#include "Typeable.h" + import Outputable -import Util ( isSingleton ) +import Util +import Data.Data import Data.List ( partition ) + +infixr 3 `consBag` +infixl 3 `snocBag` \end{code} @@ -38,6 +44,12 @@ emptyBag = EmptyBag unitBag :: a -> Bag a unitBag = UnitBag +lengthBag :: Bag a -> Int +lengthBag EmptyBag = 0 +lengthBag (UnitBag {}) = 1 +lengthBag (TwoBags b1 b2) = lengthBag b1 + lengthBag b2 +lengthBag (ListBag xs) = length xs + elemBag :: Eq a => a -> Bag a -> Bool elemBag _ EmptyBag = False elemBag x (UnitBag y) = x == y @@ -178,5 +190,13 @@ bagToList b = foldrBag (:) [] b \begin{code} instance (Outputable a) => Outputable (Bag a) where - ppr bag = char '<' <> pprWithCommas ppr (bagToList bag) <> char '>' + ppr bag = braces (pprWithCommas ppr (bagToList bag)) + +INSTANCE_TYPEABLE1(Bag,bagTc,"Bag") + +instance Data a => Data (Bag a) where + gfoldl k z b = z listToBag `k` bagToList b -- traverse abstract type abstractly + toConstr _ = abstractConstr $ "Bag("++show (typeOf (undefined::a))++")" + gunfold _ _ = error "gunfold" + dataTypeOf _ = mkNoRepType "Bag" \end{code}