{-# LANGUAGE TypeFamilies, MultiParamTypeClasses, FlexibleInstances #-}
module Simulation.Aivika.Branch.QueueStrategy () where
import Control.Monad.Trans
import Simulation.Aivika.Trans
import qualified Simulation.Aivika.Trans.DoubleLinkedList as LL
import Simulation.Aivika.Branch.Internal.BR
import Simulation.Aivika.Branch.Ref.Base
instance QueueStrategy (BR IO) FCFS where
newtype StrategyQueue (BR IO) FCFS a = FCFSQueue (LL.DoubleLinkedList (BR IO) a)
newStrategyQueue :: forall a. FCFS -> Simulation (BR IO) (StrategyQueue (BR IO) FCFS a)
newStrategyQueue FCFS
s = (DoubleLinkedList (BR IO) a -> StrategyQueue (BR IO) FCFS a)
-> Simulation (BR IO) (DoubleLinkedList (BR IO) a)
-> Simulation (BR IO) (StrategyQueue (BR IO) FCFS a)
forall a b.
(a -> b) -> Simulation (BR IO) a -> Simulation (BR IO) b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap DoubleLinkedList (BR IO) a -> StrategyQueue (BR IO) FCFS a
forall a.
DoubleLinkedList (BR IO) a -> StrategyQueue (BR IO) FCFS a
FCFSQueue Simulation (BR IO) (DoubleLinkedList (BR IO) a)
forall (m :: * -> *) a.
MonadRef m =>
Simulation m (DoubleLinkedList m a)
LL.newList
strategyQueueNull :: forall a. StrategyQueue (BR IO) FCFS a -> Event (BR IO) Bool
strategyQueueNull (FCFSQueue DoubleLinkedList (BR IO) a
q) = DoubleLinkedList (BR IO) a -> Event (BR IO) Bool
forall (m :: * -> *) a.
MonadRef m =>
DoubleLinkedList m a -> Event m Bool
LL.listNull DoubleLinkedList (BR IO) a
q
instance DequeueStrategy (BR IO) FCFS where
strategyDequeue :: forall a. StrategyQueue (BR IO) FCFS a -> Event (BR IO) a
strategyDequeue (FCFSQueue DoubleLinkedList (BR IO) a
q) =
do a
i <- DoubleLinkedList (BR IO) a -> Event (BR IO) a
forall (m :: * -> *) a.
MonadRef m =>
DoubleLinkedList m a -> Event m a
LL.listFirst DoubleLinkedList (BR IO) a
q
DoubleLinkedList (BR IO) a -> Event (BR IO) ()
forall (m :: * -> *) a.
MonadRef m =>
DoubleLinkedList m a -> Event m ()
LL.listRemoveFirst DoubleLinkedList (BR IO) a
q
a -> Event (BR IO) a
forall a. a -> Event (BR IO) a
forall (m :: * -> *) a. Monad m => a -> m a
return a
i
instance EnqueueStrategy (BR IO) FCFS where
strategyEnqueue :: forall a. StrategyQueue (BR IO) FCFS a -> a -> Event (BR IO) ()
strategyEnqueue (FCFSQueue DoubleLinkedList (BR IO) a
q) a
i = DoubleLinkedList (BR IO) a -> a -> Event (BR IO) ()
forall (m :: * -> *) a.
MonadRef m =>
DoubleLinkedList m a -> a -> Event m ()
LL.listAddLast DoubleLinkedList (BR IO) a
q a
i
instance QueueStrategy (BR IO) LCFS where
newtype StrategyQueue (BR IO) LCFS a = LCFSQueue (LL.DoubleLinkedList (BR IO) a)
newStrategyQueue :: forall a. LCFS -> Simulation (BR IO) (StrategyQueue (BR IO) LCFS a)
newStrategyQueue LCFS
s = (DoubleLinkedList (BR IO) a -> StrategyQueue (BR IO) LCFS a)
-> Simulation (BR IO) (DoubleLinkedList (BR IO) a)
-> Simulation (BR IO) (StrategyQueue (BR IO) LCFS a)
forall a b.
(a -> b) -> Simulation (BR IO) a -> Simulation (BR IO) b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap DoubleLinkedList (BR IO) a -> StrategyQueue (BR IO) LCFS a
forall a.
DoubleLinkedList (BR IO) a -> StrategyQueue (BR IO) LCFS a
LCFSQueue Simulation (BR IO) (DoubleLinkedList (BR IO) a)
forall (m :: * -> *) a.
MonadRef m =>
Simulation m (DoubleLinkedList m a)
LL.newList
strategyQueueNull :: forall a. StrategyQueue (BR IO) LCFS a -> Event (BR IO) Bool
strategyQueueNull (LCFSQueue DoubleLinkedList (BR IO) a
q) = DoubleLinkedList (BR IO) a -> Event (BR IO) Bool
forall (m :: * -> *) a.
MonadRef m =>
DoubleLinkedList m a -> Event m Bool
LL.listNull DoubleLinkedList (BR IO) a
q
instance DequeueStrategy (BR IO) LCFS where
strategyDequeue :: forall a. StrategyQueue (BR IO) LCFS a -> Event (BR IO) a
strategyDequeue (LCFSQueue DoubleLinkedList (BR IO) a
q) =
do a
i <- DoubleLinkedList (BR IO) a -> Event (BR IO) a
forall (m :: * -> *) a.
MonadRef m =>
DoubleLinkedList m a -> Event m a
LL.listFirst DoubleLinkedList (BR IO) a
q
DoubleLinkedList (BR IO) a -> Event (BR IO) ()
forall (m :: * -> *) a.
MonadRef m =>
DoubleLinkedList m a -> Event m ()
LL.listRemoveFirst DoubleLinkedList (BR IO) a
q
a -> Event (BR IO) a
forall a. a -> Event (BR IO) a
forall (m :: * -> *) a. Monad m => a -> m a
return a
i
instance EnqueueStrategy (BR IO) LCFS where
strategyEnqueue :: forall a. StrategyQueue (BR IO) LCFS a -> a -> Event (BR IO) ()
strategyEnqueue (LCFSQueue DoubleLinkedList (BR IO) a
q) a
i = DoubleLinkedList (BR IO) a -> a -> Event (BR IO) ()
forall (m :: * -> *) a.
MonadRef m =>
DoubleLinkedList m a -> a -> Event m ()
LL.listInsertFirst DoubleLinkedList (BR IO) a
q a
i