packages feed

EnumContainers-0.1: src/Data/EnumIntSet.hs

module Data.EnumIntSet(EnumIntSet, empty, union,
                       unions, fromList, toList, elems,
                       member, notMember) where

import Prelude hiding (lookup)
import qualified Data.IntSet as IntSet
import Data.IntSet(IntSet)
import Data.Monoid(Monoid(..))

newtype EnumIntSet k = EnumIntSet { unEnumIntSet :: IntSet }
  deriving (Show, Read, Eq, Ord)

inEnumIntSet :: (IntSet -> IntSet) -> EnumIntSet k -> EnumIntSet k'
inEnumIntSet f = EnumIntSet . f . unEnumIntSet

inEnumIntSet2 :: (IntSet -> IntSet -> IntSet) -> EnumIntSet k -> EnumIntSet k' -> EnumIntSet k''
inEnumIntSet2 f = inEnumIntSet . f . unEnumIntSet

instance Monoid (EnumIntSet k) where
  mempty = EnumIntSet mempty
  mappend = inEnumIntSet2 mappend

empty :: Enum k => EnumIntSet k
empty = mempty

union :: EnumIntSet k -> EnumIntSet k -> EnumIntSet k
union = mappend

unions :: [EnumIntSet k] -> EnumIntSet k
unions = mconcat

fromList :: Enum k => [k] -> EnumIntSet k
fromList = EnumIntSet . IntSet.fromList . map fromEnum

toList :: Enum k => EnumIntSet k -> [k]
toList = map toEnum . IntSet.toList . unEnumIntSet

elems :: Enum k => EnumIntSet k -> [k]
elems = toList

member :: Enum k => k -> EnumIntSet k -> Bool
member k = IntSet.member (fromEnum k) . unEnumIntSet

notMember :: Enum k => k -> EnumIntSet k -> Bool
notMember k = not . member k