module Data.Selection
( Selection
, includes
, selectBy
, empty
, universal
, select
, union
, intersection
, difference
, allExcept
) where
data Selection a = Selection (a -> Bool)
instance Monoid (Selection a)
where
mempty = empty
mappend = union
includes :: Selection a -> a -> Bool
includes (Selection p) = p
selectBy :: (a -> Bool) -> Selection a
selectBy = Selection
empty :: Selection a
empty = Selection $ \_ -> False
universal :: Selection a
universal = Selection $ \_ -> True
union :: Selection a -> Selection a -> Selection a
union s t = Selection $ \a -> includes s a || includes t a
intersection :: Selection a -> Selection a -> Selection a
intersection s t = Selection $ \a -> includes s a && includes t a
difference :: Selection a -> Selection a -> Selection a
difference s t = Selection $ \a -> includes s a && not (includes t a)
select :: Eq a => [a] -> Selection a
select as = selectBy (`elem` as)
allExcept :: Eq a => [a] -> Selection a
allExcept = difference universal . select