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 {
      forall queue set. Methods queue set -> EnumMap SetId set -> queue
fromEnumMap :: 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