module Data.Set.Ordered.Unique.Finite where
import qualified Data.Set as Set
newtype FiniteSet a = FiniteSet
{ unFiniteSet :: (Set.Set a, Set.Set a) }
deriving (Eq, Show)
(\\) :: Ord a => FiniteSet a -> FiniteSet a -> FiniteSet a
(\\) = difference
null :: FiniteSet a -> Bool
null (FiniteSet (_,xs)) = Set.null xs
size :: FiniteSet a -> Int
size (FiniteSet (_,xs)) = Set.size xs
member :: Ord a => a -> FiniteSet a -> Bool
member x (FiniteSet (_,xs)) = Set.member x xs
notMember :: Ord a => a -> FiniteSet a -> Bool
notMember x = not . member x
isSubsetOf :: Ord a => FiniteSet a -> FiniteSet a -> Bool
isSubsetOf (FiniteSet (t1,xs)) (FiniteSet (t2,ys)) =
Set.isSubsetOf t1 t2 && Set.isSubsetOf xs ys
isProperSubsetOf :: Ord a => FiniteSet a -> FiniteSet a -> Bool
isProperSubsetOf (FiniteSet (t1,xs)) (FiniteSet (t2,ys)) =
Set.isProperSubsetOf xs ys && Set.isSubsetOf t1 t2
empty :: Set.Set a -> FiniteSet a
empty t = FiniteSet (t, Set.empty)
total :: FiniteSet a -> Set.Set a
total (FiniteSet (t,_)) = t
singleton :: Set.Set a -> a -> FiniteSet a
singleton t x = FiniteSet (t, Set.singleton x)
insert :: Ord a => a -> FiniteSet a -> FiniteSet a
insert x (FiniteSet (t,xs)) = FiniteSet (t, Set.insert x xs)
delete :: Ord a => a -> FiniteSet a -> FiniteSet a
delete x (FiniteSet (t,xs)) = FiniteSet (t, Set.delete x xs)
union :: Ord a => FiniteSet a -> FiniteSet a -> FiniteSet a
union (FiniteSet (_,xs)) (FiniteSet (t,ys)) = FiniteSet (t, Set.union xs ys)
difference :: Ord a => FiniteSet a -> FiniteSet a -> FiniteSet a
difference (FiniteSet (_,xs)) (FiniteSet (t,ys)) = FiniteSet (t, Set.difference xs ys)
intersection :: Ord a => FiniteSet a -> FiniteSet a -> FiniteSet a
intersection (FiniteSet (_,xs)) (FiniteSet (t,ys)) = FiniteSet (t, Set.intersection xs ys)
complement :: Ord a => FiniteSet a -> FiniteSet a
complement (FiniteSet (t,xs)) = FiniteSet (t, Set.difference t xs)
filter :: (a -> Bool) -> FiniteSet a -> FiniteSet a
filter p (FiniteSet (t,xs)) = FiniteSet (t, Set.filter p xs)
partition :: (a -> Bool) -> FiniteSet a -> (FiniteSet a, FiniteSet a)
partition p (FiniteSet (t,xs)) = let (l,r) = Set.partition p xs
in (FiniteSet (t,l), FiniteSet (t,r))
map :: Ord b => (a -> b) -> FiniteSet a -> FiniteSet b
map f (FiniteSet (t,xs)) = FiniteSet (Set.map f t, Set.map f xs)