module Math.SetCover.Queue (SetId(..), Methods(..), findMin) where
import Data.EnumMap (EnumMap)
import Data.EnumSet (EnumSet)
newtype SetId = SetId Int
instance Enum SetId where
fromEnum :: SetId -> Int
fromEnum (SetId Int
n) = Int
n
toEnum :: Int -> SetId
toEnum = Int -> SetId
SetId
data Methods queue set =
Methods {
:: EnumMap SetId set -> queue,
forall queue set.
Methods queue set -> queue -> set -> (EnumSet SetId, queue)
partition :: queue -> set -> (EnumSet SetId, queue),
forall queue set.
Methods queue set -> queue -> EnumMap SetId set -> queue
difference :: queue -> EnumMap SetId set -> queue,
forall queue set.
Methods queue set -> queue -> Maybe (set, EnumSet SetId)
findMinValue :: queue -> Maybe (set, EnumSet SetId),
forall queue set. Methods queue set -> queue -> Bool
null :: queue -> Bool
}
findMin :: Methods queue set -> queue -> Maybe (EnumSet SetId)
findMin :: forall queue set.
Methods queue set -> queue -> Maybe (EnumSet SetId)
findMin Methods queue set
dict = ((set, EnumSet SetId) -> EnumSet SetId)
-> Maybe (set, EnumSet SetId) -> Maybe (EnumSet SetId)
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (set, EnumSet SetId) -> EnumSet SetId
forall a b. (a, b) -> b
snd (Maybe (set, EnumSet SetId) -> Maybe (EnumSet SetId))
-> (queue -> Maybe (set, EnumSet SetId))
-> queue
-> Maybe (EnumSet SetId)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Methods queue set -> queue -> Maybe (set, EnumSet SetId)
forall queue set.
Methods queue set -> queue -> Maybe (set, EnumSet SetId)
findMinValue Methods queue set
dict