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