module Simulation.Aivika.Distributed.Optimistic.QueueStrategy () where
import Control.Monad.Trans
import Simulation.Aivika.Trans
import qualified Simulation.Aivika.Trans.DoubleLinkedList as LL
import Simulation.Aivika.Distributed.Optimistic.Internal.DIO
import Simulation.Aivika.Distributed.Optimistic.Ref.Base
instance QueueStrategy DIO FCFS where
  
  newtype StrategyQueue DIO FCFS a = FCFSQueue (LL.DoubleLinkedList DIO a)
  newStrategyQueue s = fmap FCFSQueue LL.newList
  strategyQueueNull (FCFSQueue q) = LL.listNull q
instance DequeueStrategy DIO FCFS where
  strategyDequeue (FCFSQueue q) =
    do i <- LL.listFirst q
       LL.listRemoveFirst q
       return i
instance EnqueueStrategy DIO FCFS where
  strategyEnqueue (FCFSQueue q) i = LL.listAddLast q i
instance QueueStrategy DIO LCFS where
  
  newtype StrategyQueue DIO LCFS a = LCFSQueue (LL.DoubleLinkedList DIO a)
  newStrategyQueue s = fmap LCFSQueue LL.newList
       
  strategyQueueNull (LCFSQueue q) = LL.listNull q
instance DequeueStrategy DIO LCFS where
  strategyDequeue (LCFSQueue q) =
    do i <- LL.listFirst q
       LL.listRemoveFirst q
       return i
instance EnqueueStrategy DIO LCFS where
  strategyEnqueue (LCFSQueue q) i = LL.listInsertFirst q i