module Math.SetCover.BitSet where

import qualified Math.SetCover.Bit as Bit
import Math.SetCover.Bit ((.|.), (.&.))

import Data.Monoid (Monoid, mempty, mappend)
import Data.Semigroup (Semigroup, (<>))


newtype Set bits = Set {forall bits. Set bits -> bits
getBits :: bits} deriving (Set bits -> Set bits -> Bool
(Set bits -> Set bits -> Bool)
-> (Set bits -> Set bits -> Bool) -> Eq (Set bits)
forall bits. Eq bits => Set bits -> Set bits -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall bits. Eq bits => Set bits -> Set bits -> Bool
== :: Set bits -> Set bits -> Bool
$c/= :: forall bits. Eq bits => Set bits -> Set bits -> Bool
/= :: Set bits -> Set bits -> Bool
Eq, Eq (Set bits)
Eq (Set bits)
-> (Set bits -> Set bits -> Ordering)
-> (Set bits -> Set bits -> Bool)
-> (Set bits -> Set bits -> Bool)
-> (Set bits -> Set bits -> Bool)
-> (Set bits -> Set bits -> Bool)
-> (Set bits -> Set bits -> Set bits)
-> (Set bits -> Set bits -> Set bits)
-> Ord (Set bits)
Set bits -> Set bits -> Bool
Set bits -> Set bits -> Ordering
Set bits -> Set bits -> Set bits
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall {bits}. Ord bits => Eq (Set bits)
forall bits. Ord bits => Set bits -> Set bits -> Bool
forall bits. Ord bits => Set bits -> Set bits -> Ordering
forall bits. Ord bits => Set bits -> Set bits -> Set bits
$ccompare :: forall bits. Ord bits => Set bits -> Set bits -> Ordering
compare :: Set bits -> Set bits -> Ordering
$c< :: forall bits. Ord bits => Set bits -> Set bits -> Bool
< :: Set bits -> Set bits -> Bool
$c<= :: forall bits. Ord bits => Set bits -> Set bits -> Bool
<= :: Set bits -> Set bits -> Bool
$c> :: forall bits. Ord bits => Set bits -> Set bits -> Bool
> :: Set bits -> Set bits -> Bool
$c>= :: forall bits. Ord bits => Set bits -> Set bits -> Bool
>= :: Set bits -> Set bits -> Bool
$cmax :: forall bits. Ord bits => Set bits -> Set bits -> Set bits
max :: Set bits -> Set bits -> Set bits
$cmin :: forall bits. Ord bits => Set bits -> Set bits -> Set bits
min :: Set bits -> Set bits -> Set bits
Ord, Int -> Set bits -> ShowS
[Set bits] -> ShowS
Set bits -> String
(Int -> Set bits -> ShowS)
-> (Set bits -> String) -> ([Set bits] -> ShowS) -> Show (Set bits)
forall bits. Show bits => Int -> Set bits -> ShowS
forall bits. Show bits => [Set bits] -> ShowS
forall bits. Show bits => Set bits -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall bits. Show bits => Int -> Set bits -> ShowS
showsPrec :: Int -> Set bits -> ShowS
$cshow :: forall bits. Show bits => Set bits -> String
show :: Set bits -> String
$cshowList :: forall bits. Show bits => [Set bits] -> ShowS
showList :: [Set bits] -> ShowS
Show)

instance (Bit.C bits) => Semigroup (Set bits) where
   Set bits
x <> :: Set bits -> Set bits -> Set bits
<> Set bits
y = bits -> Set bits
forall bits. bits -> Set bits
Set (bits -> Set bits) -> bits -> Set bits
forall a b. (a -> b) -> a -> b
$ bits
xbits -> bits -> bits
forall bits. C bits => bits -> bits -> bits
.|.bits
y

instance (Bit.C bits) => Monoid (Set bits) where
   mempty :: Set bits
mempty = Set bits
forall bits. C bits => Set bits
empty
   mappend :: Set bits -> Set bits -> Set bits
mappend = Set bits -> Set bits -> Set bits
forall a. Semigroup a => a -> a -> a
(<>)

empty :: Bit.C bits => Set bits
empty :: forall bits. C bits => Set bits
empty = bits -> Set bits
forall bits. bits -> Set bits
Set bits
forall bits. C bits => bits
Bit.empty

null :: Bit.C bits => Set bits -> Bool
null :: forall bits. C bits => Set bits -> Bool
null (Set bits
xs)  =  bits
xs bits -> bits -> Bool
forall a. Eq a => a -> a -> Bool
== bits
forall bits. C bits => bits
Bit.empty

keepMinimum :: Bit.C bits => Set bits -> Set bits
keepMinimum :: forall bits. C bits => Set bits -> Set bits
keepMinimum (Set bits
xs) = bits -> Set bits
forall bits. bits -> Set bits
Set (bits -> Set bits) -> bits -> Set bits
forall a b. (a -> b) -> a -> b
$ bits -> bits
forall bits. C bits => bits -> bits
Bit.keepMinimum bits
xs

disjoint :: Bit.C bits => Set bits -> Set bits -> Bool
disjoint :: forall bits. C bits => Set bits -> Set bits -> Bool
disjoint (Set bits
xs) (Set bits
ys)  =  bits
xsbits -> bits -> bits
forall bits. C bits => bits -> bits -> bits
.&.bits
ys bits -> bits -> Bool
forall a. Eq a => a -> a -> Bool
== bits
forall bits. C bits => bits
Bit.empty

difference :: Bit.C bits => Set bits -> Set bits -> Set bits
difference :: forall bits. C bits => Set bits -> Set bits -> Set bits
difference (Set bits
xs) (Set bits
ys) = bits -> Set bits
forall bits. bits -> Set bits
Set (bits -> Set bits) -> bits -> Set bits
forall a b. (a -> b) -> a -> b
$ bits -> bits -> bits
forall bits. C bits => bits -> bits -> bits
Bit.difference bits
xs bits
ys