module GHC.Data.EnumSet
( EnumSet
, member
, insert
, delete
, toList
, fromList
, empty
, difference
) where
import GHC.Prelude
import qualified Data.IntSet as IntSet
newtype EnumSet a = EnumSet IntSet.IntSet
member :: Enum a => a -> EnumSet a -> Bool
member :: forall a. Enum a => a -> EnumSet a -> Bool
member a
x (EnumSet IntSet
s) = Key -> IntSet -> Bool
IntSet.member (forall a. Enum a => a -> Key
fromEnum a
x) IntSet
s
insert :: Enum a => a -> EnumSet a -> EnumSet a
insert :: forall a. Enum a => a -> EnumSet a -> EnumSet a
insert a
x (EnumSet IntSet
s) = forall a. IntSet -> EnumSet a
EnumSet forall a b. (a -> b) -> a -> b
$ Key -> IntSet -> IntSet
IntSet.insert (forall a. Enum a => a -> Key
fromEnum a
x) IntSet
s
delete :: Enum a => a -> EnumSet a -> EnumSet a
delete :: forall a. Enum a => a -> EnumSet a -> EnumSet a
delete a
x (EnumSet IntSet
s) = forall a. IntSet -> EnumSet a
EnumSet forall a b. (a -> b) -> a -> b
$ Key -> IntSet -> IntSet
IntSet.delete (forall a. Enum a => a -> Key
fromEnum a
x) IntSet
s
toList :: Enum a => EnumSet a -> [a]
toList :: forall a. Enum a => EnumSet a -> [a]
toList (EnumSet IntSet
s) = forall a b. (a -> b) -> [a] -> [b]
map forall a. Enum a => Key -> a
toEnum forall a b. (a -> b) -> a -> b
$ IntSet -> [Key]
IntSet.toList IntSet
s
fromList :: Enum a => [a] -> EnumSet a
fromList :: forall a. Enum a => [a] -> EnumSet a
fromList = forall a. IntSet -> EnumSet a
EnumSet forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Key] -> IntSet
IntSet.fromList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map forall a. Enum a => a -> Key
fromEnum
empty :: EnumSet a
empty :: forall a. EnumSet a
empty = forall a. IntSet -> EnumSet a
EnumSet IntSet
IntSet.empty
difference :: EnumSet a -> EnumSet a -> EnumSet a
difference :: forall a. EnumSet a -> EnumSet a -> EnumSet a
difference (EnumSet IntSet
a) (EnumSet IntSet
b) = forall a. IntSet -> EnumSet a
EnumSet (IntSet -> IntSet -> IntSet
IntSet.difference IntSet
a IntSet
b)