{-# LANGUAGE FlexibleInstances #-} {-# OPTIONS_GHC -XMultiParamTypeClasses -XTypeSynonymInstances -fno-warn-orphans #-} module Data.Collections.EnumSet ( module Data.Collections, EnumSet, ) where import Prelude hiding (sum,concat,lookup,map,filter,foldr,foldr1,foldl,null,reverse,(++),minimum,maximum,all,elem,concatMap,drop,head,tail,init) import Control.Monad import Data.Collections import Data.Collections.Foldable import qualified Data.Set.Enum as EnumSet type EnumSet = EnumSet.Set instance Enum a => Foldable (EnumSet.Set a) a where foldr f i s = EnumSet.foldr f i s null = EnumSet.null size = EnumSet.size instance Enum a => Unfoldable (EnumSet.Set a) a where insert = EnumSet.insert singleton = EnumSet.singleton empty = EnumSet.empty instance Enum a => Collection (EnumSet.Set a) a where filter = EnumSet.filter instance Enum a => Set (EnumSet.Set a) a where haddock_candy = haddock_candy instance Enum a => Map (EnumSet.Set a) a () where isSubmapBy f x y = isSubset x y && (f () () || null (intersection x y)) isSubset = EnumSet.isSubsetOf member = EnumSet.member union = EnumSet.union difference = EnumSet.difference intersection = EnumSet.intersection delete = EnumSet.delete insertWith _f k () = insert k unionWith _f = union intersectionWith _f = intersection differenceWith f s1 s2 = if f () () == Nothing then difference s1 s2 else s1 lookup k l = if member k l then return () else fail "element not found" alter f k m = case f (lookup k m) of Just _ -> insert k m Nothing -> delete k m mapWithKey _f = id