{- |
Alternative to "Math.SetCover.Queue.Set"
that represents sets by bit masks and uses a bitset-based Int priority queue.
-}
module Math.SetCover.Queue.BitPriorityQueue (Methods, methods) where

import qualified Math.SetCover.Queue as Queue
import Math.SetCover.Queue (SetId)

import qualified Math.SetCover.BitPriorityQueue as BitPQ
import qualified Math.SetCover.BitPosition as BitPos
import qualified Math.SetCover.BitSet as BitSet

import Data.Tuple.HT (mapFst)


type Methods bits = Queue.Methods (BitPQ.Queue bits SetId) (BitSet.Set bits)

methods :: BitPos.C bits => Methods bits
methods :: forall bits. C bits => Methods bits
methods =
   Queue.Methods {
      fromEnumMap :: EnumMap SetId (Set bits) -> Queue bits SetId
Queue.fromEnumMap = EnumMap SetId (Set bits) -> Queue bits SetId
forall e bits.
(Enum e, C bits) =>
EnumMap e (Set bits) -> Queue bits e
BitPQ.fromSets,
      partition :: Queue bits SetId -> Set bits -> (EnumSet SetId, Queue bits SetId)
Queue.partition = ((Queue bits SetId -> EnumSet SetId)
-> (Queue bits SetId, Queue bits SetId)
-> (EnumSet SetId, Queue bits SetId)
forall a c b. (a -> c) -> (a, b) -> (c, b)
mapFst Queue bits SetId -> EnumSet SetId
forall e t. Enum e => Queue t e -> EnumSet e
BitPQ.elemUnions((Queue bits SetId, Queue bits SetId)
 -> (EnumSet SetId, Queue bits SetId))
-> (Set bits -> (Queue bits SetId, Queue bits SetId))
-> Set bits
-> (EnumSet SetId, Queue bits SetId)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Set bits -> (Queue bits SetId, Queue bits SetId))
 -> Set bits -> (EnumSet SetId, Queue bits SetId))
-> (Queue bits SetId
    -> Set bits -> (Queue bits SetId, Queue bits SetId))
-> Queue bits SetId
-> Set bits
-> (EnumSet SetId, Queue bits SetId)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Queue bits SetId
-> Set bits -> (Queue bits SetId, Queue bits SetId)
forall bits e.
(C bits, Enum e) =>
Queue bits e -> Set bits -> (Queue bits e, Queue bits e)
BitPQ.partition,
      difference :: Queue bits SetId -> EnumMap SetId (Set bits) -> Queue bits SetId
Queue.difference = \Queue bits SetId
q -> Queue bits SetId -> Queue bits SetId -> Queue bits SetId
forall bits e.
(C bits, Enum e) =>
Queue bits e -> Queue bits e -> Queue bits e
BitPQ.difference Queue bits SetId
q (Queue bits SetId -> Queue bits SetId)
-> (EnumMap SetId (Set bits) -> Queue bits SetId)
-> EnumMap SetId (Set bits)
-> Queue bits SetId
forall b c a. (b -> c) -> (a -> b) -> a -> c
. EnumMap SetId (Set bits) -> Queue bits SetId
forall e bits.
(Enum e, C bits) =>
EnumMap e (Set bits) -> Queue bits e
BitPQ.fromSets,
      findMinValue :: Queue bits SetId -> Maybe (Set bits, EnumSet SetId)
Queue.findMinValue = Queue bits SetId -> Maybe (Set bits, EnumSet SetId)
forall bits e.
C bits =>
Queue bits e -> Maybe (Set bits, EnumSet e)
BitPQ.findMinValue,
      null :: Queue bits SetId -> Bool
Queue.null = Queue bits SetId -> Bool
forall bits e. Queue bits e -> Bool
BitPQ.null
   }