{-# LANGUAGE CPP #-}
module Data.Selection
( Selection
, includes
, selectBy
, empty
, universal
, select
, union
, intersection
, difference
, allExcept
) where
data Selection a = Selection (a -> Bool)
#if MIN_VERSION_base(4,11,0)
instance Semigroup (Selection a)
where
<> :: Selection a -> Selection a -> Selection a
(<>) = Selection a -> Selection a -> Selection a
forall a. Selection a -> Selection a -> Selection a
union
#endif
instance Monoid (Selection a)
where
mempty :: Selection a
mempty = Selection a
forall a. Selection a
empty
mappend :: Selection a -> Selection a -> Selection a
mappend = Selection a -> Selection a -> Selection a
forall a. Semigroup a => a -> a -> a
(<>)
includes :: Selection a -> a -> Bool
includes :: Selection a -> a -> Bool
includes (Selection a -> Bool
p) = a -> Bool
p
selectBy :: (a -> Bool) -> Selection a
selectBy :: (a -> Bool) -> Selection a
selectBy = (a -> Bool) -> Selection a
forall a. (a -> Bool) -> Selection a
Selection
empty :: Selection a
empty :: Selection a
empty = (a -> Bool) -> Selection a
forall a. (a -> Bool) -> Selection a
Selection ((a -> Bool) -> Selection a) -> (a -> Bool) -> Selection a
forall a b. (a -> b) -> a -> b
$ \a
_ -> Bool
False
universal :: Selection a
universal :: Selection a
universal = (a -> Bool) -> Selection a
forall a. (a -> Bool) -> Selection a
Selection ((a -> Bool) -> Selection a) -> (a -> Bool) -> Selection a
forall a b. (a -> b) -> a -> b
$ \a
_ -> Bool
True
union :: Selection a -> Selection a -> Selection a
union :: Selection a -> Selection a -> Selection a
union Selection a
s Selection a
t = (a -> Bool) -> Selection a
forall a. (a -> Bool) -> Selection a
Selection ((a -> Bool) -> Selection a) -> (a -> Bool) -> Selection a
forall a b. (a -> b) -> a -> b
$ \a
a -> Selection a -> a -> Bool
forall a. Selection a -> a -> Bool
includes Selection a
s a
a Bool -> Bool -> Bool
|| Selection a -> a -> Bool
forall a. Selection a -> a -> Bool
includes Selection a
t a
a
intersection :: Selection a -> Selection a -> Selection a
intersection :: Selection a -> Selection a -> Selection a
intersection Selection a
s Selection a
t = (a -> Bool) -> Selection a
forall a. (a -> Bool) -> Selection a
Selection ((a -> Bool) -> Selection a) -> (a -> Bool) -> Selection a
forall a b. (a -> b) -> a -> b
$ \a
a -> Selection a -> a -> Bool
forall a. Selection a -> a -> Bool
includes Selection a
s a
a Bool -> Bool -> Bool
&& Selection a -> a -> Bool
forall a. Selection a -> a -> Bool
includes Selection a
t a
a
difference :: Selection a -> Selection a -> Selection a
difference :: Selection a -> Selection a -> Selection a
difference Selection a
s Selection a
t = (a -> Bool) -> Selection a
forall a. (a -> Bool) -> Selection a
Selection ((a -> Bool) -> Selection a) -> (a -> Bool) -> Selection a
forall a b. (a -> b) -> a -> b
$ \a
a -> Selection a -> a -> Bool
forall a. Selection a -> a -> Bool
includes Selection a
s a
a Bool -> Bool -> Bool
&& Bool -> Bool
not (Selection a -> a -> Bool
forall a. Selection a -> a -> Bool
includes Selection a
t a
a)
select :: Eq a => [a] -> Selection a
select :: [a] -> Selection a
select [a]
as = (a -> Bool) -> Selection a
forall a. (a -> Bool) -> Selection a
selectBy (a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [a]
as)
allExcept :: Eq a => [a] -> Selection a
allExcept :: [a] -> Selection a
allExcept = Selection a -> Selection a -> Selection a
forall a. Selection a -> Selection a -> Selection a
difference Selection a
forall a. Selection a
universal (Selection a -> Selection a)
-> ([a] -> Selection a) -> [a] -> Selection a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> Selection a
forall a. Eq a => [a] -> Selection a
select