module Simulation.Aivika.Queue.Base
(
FCFSQueue,
LCFSQueue,
SIROQueue,
PriorityQueue,
Queue,
newFCFSQueue,
newLCFSQueue,
newSIROQueue,
newPriorityQueue,
newQueue,
enqueueStrategy,
enqueueStoringStrategy,
dequeueStrategy,
queueNull,
queueFull,
queueMaxCount,
queueCount,
dequeue,
dequeueWithOutputPriority,
tryDequeue,
enqueue,
enqueueWithInputPriority,
enqueueWithStoringPriority,
enqueueWithInputStoringPriorities,
tryEnqueue,
tryEnqueueWithStoringPriority,
queueDelete,
queueDelete_,
queueDeleteBy,
queueDeleteBy_,
queueContains,
queueContainsBy,
clearQueue) where
import Data.IORef
import Data.Monoid
import Data.Maybe
import Control.Monad
import Control.Monad.Trans
import Simulation.Aivika.Internal.Specs
import Simulation.Aivika.Internal.Simulation
import Simulation.Aivika.Internal.Dynamics
import Simulation.Aivika.Internal.Event
import Simulation.Aivika.Internal.Process
import Simulation.Aivika.Resource.Base
import Simulation.Aivika.QueueStrategy
import qualified Simulation.Aivika.DoubleLinkedList as DLL
import qualified Simulation.Aivika.Vector as V
import qualified Simulation.Aivika.PriorityQueue as PQ
type FCFSQueue a = Queue FCFS FCFS FCFS a
type LCFSQueue a = Queue FCFS LCFS FCFS a
type SIROQueue a = Queue FCFS SIRO FCFS a
type PriorityQueue a = Queue FCFS StaticPriorities FCFS a
data Queue si sm so a =
Queue { Queue si sm so a -> Int
queueMaxCount :: Int,
Queue si sm so a -> si
enqueueStrategy :: si,
Queue si sm so a -> sm
enqueueStoringStrategy :: sm,
Queue si sm so a -> so
dequeueStrategy :: so,
Queue si sm so a -> Resource si
enqueueRes :: Resource si,
Queue si sm so a -> StrategyQueue sm a
queueStore :: StrategyQueue sm a,
Queue si sm so a -> Resource so
dequeueRes :: Resource so,
Queue si sm so a -> IORef Int
queueCountRef :: IORef Int
}
newFCFSQueue :: Int -> Simulation (FCFSQueue a)
newFCFSQueue :: Int -> Simulation (FCFSQueue a)
newFCFSQueue = FCFS -> FCFS -> FCFS -> Int -> Simulation (FCFSQueue a)
forall si sm so a.
(QueueStrategy si, QueueStrategy sm, QueueStrategy so) =>
si -> sm -> so -> Int -> Simulation (Queue si sm so a)
newQueue FCFS
FCFS FCFS
FCFS FCFS
FCFS
newLCFSQueue :: Int -> Simulation (LCFSQueue a)
newLCFSQueue :: Int -> Simulation (LCFSQueue a)
newLCFSQueue = FCFS -> LCFS -> FCFS -> Int -> Simulation (LCFSQueue a)
forall si sm so a.
(QueueStrategy si, QueueStrategy sm, QueueStrategy so) =>
si -> sm -> so -> Int -> Simulation (Queue si sm so a)
newQueue FCFS
FCFS LCFS
LCFS FCFS
FCFS
newSIROQueue :: Int -> Simulation (SIROQueue a)
newSIROQueue :: Int -> Simulation (SIROQueue a)
newSIROQueue = FCFS -> SIRO -> FCFS -> Int -> Simulation (SIROQueue a)
forall si sm so a.
(QueueStrategy si, QueueStrategy sm, QueueStrategy so) =>
si -> sm -> so -> Int -> Simulation (Queue si sm so a)
newQueue FCFS
FCFS SIRO
SIRO FCFS
FCFS
newPriorityQueue :: Int -> Simulation (PriorityQueue a)
newPriorityQueue :: Int -> Simulation (PriorityQueue a)
newPriorityQueue = FCFS
-> StaticPriorities -> FCFS -> Int -> Simulation (PriorityQueue a)
forall si sm so a.
(QueueStrategy si, QueueStrategy sm, QueueStrategy so) =>
si -> sm -> so -> Int -> Simulation (Queue si sm so a)
newQueue FCFS
FCFS StaticPriorities
StaticPriorities FCFS
FCFS
newQueue :: (QueueStrategy si,
QueueStrategy sm,
QueueStrategy so) =>
si
-> sm
-> so
-> Int
-> Simulation (Queue si sm so a)
newQueue :: si -> sm -> so -> Int -> Simulation (Queue si sm so a)
newQueue si
si sm
sm so
so Int
count =
do IORef Int
i <- IO (IORef Int) -> Simulation (IORef Int)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (IORef Int) -> Simulation (IORef Int))
-> IO (IORef Int) -> Simulation (IORef Int)
forall a b. (a -> b) -> a -> b
$ Int -> IO (IORef Int)
forall a. a -> IO (IORef a)
newIORef Int
0
Resource si
ri <- si -> Int -> Maybe Int -> Simulation (Resource si)
forall s.
QueueStrategy s =>
s -> Int -> Maybe Int -> Simulation (Resource s)
newResourceWithMaxCount si
si Int
count (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
count)
StrategyQueue sm a
qm <- sm -> Simulation (StrategyQueue sm a)
forall s i. QueueStrategy s => s -> Simulation (StrategyQueue s i)
newStrategyQueue sm
sm
Resource so
ro <- so -> Int -> Maybe Int -> Simulation (Resource so)
forall s.
QueueStrategy s =>
s -> Int -> Maybe Int -> Simulation (Resource s)
newResourceWithMaxCount so
so Int
0 (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
count)
Queue si sm so a -> Simulation (Queue si sm so a)
forall (m :: * -> *) a. Monad m => a -> m a
return Queue :: forall si sm so a.
Int
-> si
-> sm
-> so
-> Resource si
-> StrategyQueue sm a
-> Resource so
-> IORef Int
-> Queue si sm so a
Queue { queueMaxCount :: Int
queueMaxCount = Int
count,
enqueueStrategy :: si
enqueueStrategy = si
si,
enqueueStoringStrategy :: sm
enqueueStoringStrategy = sm
sm,
dequeueStrategy :: so
dequeueStrategy = so
so,
enqueueRes :: Resource si
enqueueRes = Resource si
ri,
queueStore :: StrategyQueue sm a
queueStore = StrategyQueue sm a
qm,
dequeueRes :: Resource so
dequeueRes = Resource so
ro,
queueCountRef :: IORef Int
queueCountRef = IORef Int
i }
queueNull :: Queue si sm so a -> Event Bool
queueNull :: Queue si sm so a -> Event Bool
queueNull Queue si sm so a
q =
(Point -> IO Bool) -> Event Bool
forall a. (Point -> IO a) -> Event a
Event ((Point -> IO Bool) -> Event Bool)
-> (Point -> IO Bool) -> Event Bool
forall a b. (a -> b) -> a -> b
$ \Point
p ->
do Int
n <- IORef Int -> IO Int
forall a. IORef a -> IO a
readIORef (Queue si sm so a -> IORef Int
forall si sm so a. Queue si sm so a -> IORef Int
queueCountRef Queue si sm so a
q)
Bool -> IO Bool
forall (m :: * -> *) a. Monad m => a -> m a
return (Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0)
queueFull :: Queue si sm so a -> Event Bool
queueFull :: Queue si sm so a -> Event Bool
queueFull Queue si sm so a
q =
(Point -> IO Bool) -> Event Bool
forall a. (Point -> IO a) -> Event a
Event ((Point -> IO Bool) -> Event Bool)
-> (Point -> IO Bool) -> Event Bool
forall a b. (a -> b) -> a -> b
$ \Point
p ->
do Int
n <- IORef Int -> IO Int
forall a. IORef a -> IO a
readIORef (Queue si sm so a -> IORef Int
forall si sm so a. Queue si sm so a -> IORef Int
queueCountRef Queue si sm so a
q)
Bool -> IO Bool
forall (m :: * -> *) a. Monad m => a -> m a
return (Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Queue si sm so a -> Int
forall si sm so a. Queue si sm so a -> Int
queueMaxCount Queue si sm so a
q)
queueCount :: Queue si sm so a -> Event Int
queueCount :: Queue si sm so a -> Event Int
queueCount Queue si sm so a
q =
(Point -> IO Int) -> Event Int
forall a. (Point -> IO a) -> Event a
Event ((Point -> IO Int) -> Event Int) -> (Point -> IO Int) -> Event Int
forall a b. (a -> b) -> a -> b
$ \Point
p -> IORef Int -> IO Int
forall a. IORef a -> IO a
readIORef (Queue si sm so a -> IORef Int
forall si sm so a. Queue si sm so a -> IORef Int
queueCountRef Queue si sm so a
q)
dequeue :: (DequeueStrategy si,
DequeueStrategy sm,
EnqueueStrategy so)
=> Queue si sm so a
-> Process a
dequeue :: Queue si sm so a -> Process a
dequeue Queue si sm so a
q =
do Resource so -> Process ()
forall s. EnqueueStrategy s => Resource s -> Process ()
requestResource (Queue si sm so a -> Resource so
forall si sm so a. Queue si sm so a -> Resource so
dequeueRes Queue si sm so a
q)
Event a -> Process a
forall (m :: * -> *) a. EventLift m => Event a -> m a
liftEvent (Event a -> Process a) -> Event a -> Process a
forall a b. (a -> b) -> a -> b
$ Queue si sm so a -> Event a
forall si sm so a.
(DequeueStrategy si, DequeueStrategy sm) =>
Queue si sm so a -> Event a
dequeueExtract Queue si sm so a
q
dequeueWithOutputPriority :: (DequeueStrategy si,
DequeueStrategy sm,
PriorityQueueStrategy so po)
=> Queue si sm so a
-> po
-> Process a
dequeueWithOutputPriority :: Queue si sm so a -> po -> Process a
dequeueWithOutputPriority Queue si sm so a
q po
po =
do Resource so -> po -> Process ()
forall s p.
PriorityQueueStrategy s p =>
Resource s -> p -> Process ()
requestResourceWithPriority (Queue si sm so a -> Resource so
forall si sm so a. Queue si sm so a -> Resource so
dequeueRes Queue si sm so a
q) po
po
Event a -> Process a
forall (m :: * -> *) a. EventLift m => Event a -> m a
liftEvent (Event a -> Process a) -> Event a -> Process a
forall a b. (a -> b) -> a -> b
$ Queue si sm so a -> Event a
forall si sm so a.
(DequeueStrategy si, DequeueStrategy sm) =>
Queue si sm so a -> Event a
dequeueExtract Queue si sm so a
q
tryDequeue :: (DequeueStrategy si,
DequeueStrategy sm)
=> Queue si sm so a
-> Event (Maybe a)
tryDequeue :: Queue si sm so a -> Event (Maybe a)
tryDequeue Queue si sm so a
q =
do Bool
x <- Resource so -> Event Bool
forall s. Resource s -> Event Bool
tryRequestResourceWithinEvent (Queue si sm so a -> Resource so
forall si sm so a. Queue si sm so a -> Resource so
dequeueRes Queue si sm so a
q)
if Bool
x
then (a -> Maybe a) -> Event a -> Event (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> Maybe a
forall a. a -> Maybe a
Just (Event a -> Event (Maybe a)) -> Event a -> Event (Maybe a)
forall a b. (a -> b) -> a -> b
$ Queue si sm so a -> Event a
forall si sm so a.
(DequeueStrategy si, DequeueStrategy sm) =>
Queue si sm so a -> Event a
dequeueExtract Queue si sm so a
q
else Maybe a -> Event (Maybe a)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe a
forall a. Maybe a
Nothing
queueDelete :: (Eq a,
DequeueStrategy si,
DeletingQueueStrategy sm,
DequeueStrategy so)
=> Queue si sm so a
-> a
-> Event Bool
queueDelete :: Queue si sm so a -> a -> Event Bool
queueDelete Queue si sm so a
q a
a = (Maybe a -> Bool) -> Event (Maybe a) -> Event Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Maybe a -> Bool
forall a. Maybe a -> Bool
isJust (Event (Maybe a) -> Event Bool) -> Event (Maybe a) -> Event Bool
forall a b. (a -> b) -> a -> b
$ Queue si sm so a -> (a -> Bool) -> Event (Maybe a)
forall si sm so a.
(DequeueStrategy si, DeletingQueueStrategy sm,
DequeueStrategy so) =>
Queue si sm so a -> (a -> Bool) -> Event (Maybe a)
queueDeleteBy Queue si sm so a
q (a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
a)
queueDelete_ :: (Eq a,
DequeueStrategy si,
DeletingQueueStrategy sm,
DequeueStrategy so)
=> Queue si sm so a
-> a
-> Event ()
queueDelete_ :: Queue si sm so a -> a -> Event ()
queueDelete_ Queue si sm so a
q a
a = (Maybe a -> ()) -> Event (Maybe a) -> Event ()
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (() -> Maybe a -> ()
forall a b. a -> b -> a
const ()) (Event (Maybe a) -> Event ()) -> Event (Maybe a) -> Event ()
forall a b. (a -> b) -> a -> b
$ Queue si sm so a -> (a -> Bool) -> Event (Maybe a)
forall si sm so a.
(DequeueStrategy si, DeletingQueueStrategy sm,
DequeueStrategy so) =>
Queue si sm so a -> (a -> Bool) -> Event (Maybe a)
queueDeleteBy Queue si sm so a
q (a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
a)
queueDeleteBy :: (DequeueStrategy si,
DeletingQueueStrategy sm,
DequeueStrategy so)
=> Queue si sm so a
-> (a -> Bool)
-> Event (Maybe a)
queueDeleteBy :: Queue si sm so a -> (a -> Bool) -> Event (Maybe a)
queueDeleteBy Queue si sm so a
q a -> Bool
pred =
do Bool
x <- Resource so -> Event Bool
forall s. Resource s -> Event Bool
tryRequestResourceWithinEvent (Queue si sm so a -> Resource so
forall si sm so a. Queue si sm so a -> Resource so
dequeueRes Queue si sm so a
q)
if Bool
x
then do Maybe a
i <- StrategyQueue sm a -> (a -> Bool) -> Event (Maybe a)
forall s i.
DeletingQueueStrategy s =>
StrategyQueue s i -> (i -> Bool) -> Event (Maybe i)
strategyQueueDeleteBy (Queue si sm so a -> StrategyQueue sm a
forall si sm so a. Queue si sm so a -> StrategyQueue sm a
queueStore Queue si sm so a
q) a -> Bool
pred
case Maybe a
i of
Maybe a
Nothing ->
do Resource so -> Event ()
forall s. DequeueStrategy s => Resource s -> Event ()
releaseResourceWithinEvent (Queue si sm so a -> Resource so
forall si sm so a. Queue si sm so a -> Resource so
dequeueRes Queue si sm so a
q)
Maybe a -> Event (Maybe a)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe a
forall a. Maybe a
Nothing
Just a
i ->
(a -> Maybe a) -> Event a -> Event (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> Maybe a
forall a. a -> Maybe a
Just (Event a -> Event (Maybe a)) -> Event a -> Event (Maybe a)
forall a b. (a -> b) -> a -> b
$ Queue si sm so a -> a -> Event a
forall si sm so a.
(DequeueStrategy si, DequeueStrategy sm) =>
Queue si sm so a -> a -> Event a
dequeuePostExtract Queue si sm so a
q a
i
else Maybe a -> Event (Maybe a)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe a
forall a. Maybe a
Nothing
queueDeleteBy_ :: (DequeueStrategy si,
DeletingQueueStrategy sm,
DequeueStrategy so)
=> Queue si sm so a
-> (a -> Bool)
-> Event ()
queueDeleteBy_ :: Queue si sm so a -> (a -> Bool) -> Event ()
queueDeleteBy_ Queue si sm so a
q a -> Bool
pred = (Maybe a -> ()) -> Event (Maybe a) -> Event ()
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (() -> Maybe a -> ()
forall a b. a -> b -> a
const ()) (Event (Maybe a) -> Event ()) -> Event (Maybe a) -> Event ()
forall a b. (a -> b) -> a -> b
$ Queue si sm so a -> (a -> Bool) -> Event (Maybe a)
forall si sm so a.
(DequeueStrategy si, DeletingQueueStrategy sm,
DequeueStrategy so) =>
Queue si sm so a -> (a -> Bool) -> Event (Maybe a)
queueDeleteBy Queue si sm so a
q a -> Bool
pred
queueContains :: (Eq a,
DeletingQueueStrategy sm)
=> Queue si sm so a
-> a
-> Event Bool
queueContains :: Queue si sm so a -> a -> Event Bool
queueContains Queue si sm so a
q a
a = (Maybe a -> Bool) -> Event (Maybe a) -> Event Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Maybe a -> Bool
forall a. Maybe a -> Bool
isJust (Event (Maybe a) -> Event Bool) -> Event (Maybe a) -> Event Bool
forall a b. (a -> b) -> a -> b
$ Queue si sm so a -> (a -> Bool) -> Event (Maybe a)
forall sm si so a.
DeletingQueueStrategy sm =>
Queue si sm so a -> (a -> Bool) -> Event (Maybe a)
queueContainsBy Queue si sm so a
q (a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
a)
queueContainsBy :: DeletingQueueStrategy sm
=> Queue si sm so a
-> (a -> Bool)
-> Event (Maybe a)
queueContainsBy :: Queue si sm so a -> (a -> Bool) -> Event (Maybe a)
queueContainsBy Queue si sm so a
q a -> Bool
pred =
StrategyQueue sm a -> (a -> Bool) -> Event (Maybe a)
forall s i.
DeletingQueueStrategy s =>
StrategyQueue s i -> (i -> Bool) -> Event (Maybe i)
strategyQueueContainsBy (Queue si sm so a -> StrategyQueue sm a
forall si sm so a. Queue si sm so a -> StrategyQueue sm a
queueStore Queue si sm so a
q) a -> Bool
pred
clearQueue :: (DequeueStrategy si,
DequeueStrategy sm)
=> Queue si sm so a
-> Event ()
clearQueue :: Queue si sm so a -> Event ()
clearQueue Queue si sm so a
q =
do Maybe a
x <- Queue si sm so a -> Event (Maybe a)
forall si sm so a.
(DequeueStrategy si, DequeueStrategy sm) =>
Queue si sm so a -> Event (Maybe a)
tryDequeue Queue si sm so a
q
case Maybe a
x of
Maybe a
Nothing -> () -> Event ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
Just a
a -> Queue si sm so a -> Event ()
forall si sm so a.
(DequeueStrategy si, DequeueStrategy sm) =>
Queue si sm so a -> Event ()
clearQueue Queue si sm so a
q
enqueue :: (EnqueueStrategy si,
EnqueueStrategy sm,
DequeueStrategy so)
=> Queue si sm so a
-> a
-> Process ()
enqueue :: Queue si sm so a -> a -> Process ()
enqueue Queue si sm so a
q a
a =
do Resource si -> Process ()
forall s. EnqueueStrategy s => Resource s -> Process ()
requestResource (Queue si sm so a -> Resource si
forall si sm so a. Queue si sm so a -> Resource si
enqueueRes Queue si sm so a
q)
Event () -> Process ()
forall (m :: * -> *) a. EventLift m => Event a -> m a
liftEvent (Event () -> Process ()) -> Event () -> Process ()
forall a b. (a -> b) -> a -> b
$ Queue si sm so a -> a -> Event ()
forall sm so si a.
(EnqueueStrategy sm, DequeueStrategy so) =>
Queue si sm so a -> a -> Event ()
enqueueStore Queue si sm so a
q a
a
enqueueWithInputPriority :: (PriorityQueueStrategy si pi,
EnqueueStrategy sm,
DequeueStrategy so)
=> Queue si sm so a
-> pi
-> a
-> Process ()
enqueueWithInputPriority :: Queue si sm so a -> pi -> a -> Process ()
enqueueWithInputPriority Queue si sm so a
q pi
pi a
a =
do Resource si -> pi -> Process ()
forall s p.
PriorityQueueStrategy s p =>
Resource s -> p -> Process ()
requestResourceWithPriority (Queue si sm so a -> Resource si
forall si sm so a. Queue si sm so a -> Resource si
enqueueRes Queue si sm so a
q) pi
pi
Event () -> Process ()
forall (m :: * -> *) a. EventLift m => Event a -> m a
liftEvent (Event () -> Process ()) -> Event () -> Process ()
forall a b. (a -> b) -> a -> b
$ Queue si sm so a -> a -> Event ()
forall sm so si a.
(EnqueueStrategy sm, DequeueStrategy so) =>
Queue si sm so a -> a -> Event ()
enqueueStore Queue si sm so a
q a
a
enqueueWithStoringPriority :: (EnqueueStrategy si,
PriorityQueueStrategy sm pm,
DequeueStrategy so)
=> Queue si sm so a
-> pm
-> a
-> Process ()
enqueueWithStoringPriority :: Queue si sm so a -> pm -> a -> Process ()
enqueueWithStoringPriority Queue si sm so a
q pm
pm a
a =
do Resource si -> Process ()
forall s. EnqueueStrategy s => Resource s -> Process ()
requestResource (Queue si sm so a -> Resource si
forall si sm so a. Queue si sm so a -> Resource si
enqueueRes Queue si sm so a
q)
Event () -> Process ()
forall (m :: * -> *) a. EventLift m => Event a -> m a
liftEvent (Event () -> Process ()) -> Event () -> Process ()
forall a b. (a -> b) -> a -> b
$ Queue si sm so a -> pm -> a -> Event ()
forall sm pm so si a.
(PriorityQueueStrategy sm pm, DequeueStrategy so) =>
Queue si sm so a -> pm -> a -> Event ()
enqueueStoreWithPriority Queue si sm so a
q pm
pm a
a
enqueueWithInputStoringPriorities :: (PriorityQueueStrategy si pi,
PriorityQueueStrategy sm pm,
DequeueStrategy so)
=> Queue si sm so a
-> pi
-> pm
-> a
-> Process ()
enqueueWithInputStoringPriorities :: Queue si sm so a -> pi -> pm -> a -> Process ()
enqueueWithInputStoringPriorities Queue si sm so a
q pi
pi pm
pm a
a =
do Resource si -> pi -> Process ()
forall s p.
PriorityQueueStrategy s p =>
Resource s -> p -> Process ()
requestResourceWithPriority (Queue si sm so a -> Resource si
forall si sm so a. Queue si sm so a -> Resource si
enqueueRes Queue si sm so a
q) pi
pi
Event () -> Process ()
forall (m :: * -> *) a. EventLift m => Event a -> m a
liftEvent (Event () -> Process ()) -> Event () -> Process ()
forall a b. (a -> b) -> a -> b
$ Queue si sm so a -> pm -> a -> Event ()
forall sm pm so si a.
(PriorityQueueStrategy sm pm, DequeueStrategy so) =>
Queue si sm so a -> pm -> a -> Event ()
enqueueStoreWithPriority Queue si sm so a
q pm
pm a
a
tryEnqueue :: (EnqueueStrategy sm,
DequeueStrategy so)
=> Queue si sm so a
-> a
-> Event Bool
tryEnqueue :: Queue si sm so a -> a -> Event Bool
tryEnqueue Queue si sm so a
q a
a =
do Bool
x <- Resource si -> Event Bool
forall s. Resource s -> Event Bool
tryRequestResourceWithinEvent (Queue si sm so a -> Resource si
forall si sm so a. Queue si sm so a -> Resource si
enqueueRes Queue si sm so a
q)
if Bool
x
then do Queue si sm so a -> a -> Event ()
forall sm so si a.
(EnqueueStrategy sm, DequeueStrategy so) =>
Queue si sm so a -> a -> Event ()
enqueueStore Queue si sm so a
q a
a
Bool -> Event Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
else Bool -> Event Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
tryEnqueueWithStoringPriority :: (PriorityQueueStrategy sm pm,
DequeueStrategy so)
=> Queue si sm so a
-> pm
-> a
-> Event Bool
tryEnqueueWithStoringPriority :: Queue si sm so a -> pm -> a -> Event Bool
tryEnqueueWithStoringPriority Queue si sm so a
q pm
pm a
a =
do Bool
x <- Resource si -> Event Bool
forall s. Resource s -> Event Bool
tryRequestResourceWithinEvent (Queue si sm so a -> Resource si
forall si sm so a. Queue si sm so a -> Resource si
enqueueRes Queue si sm so a
q)
if Bool
x
then do Queue si sm so a -> pm -> a -> Event ()
forall sm pm so si a.
(PriorityQueueStrategy sm pm, DequeueStrategy so) =>
Queue si sm so a -> pm -> a -> Event ()
enqueueStoreWithPriority Queue si sm so a
q pm
pm a
a
Bool -> Event Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
else Bool -> Event Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
enqueueStore :: (EnqueueStrategy sm,
DequeueStrategy so)
=> Queue si sm so a
-> a
-> Event ()
enqueueStore :: Queue si sm so a -> a -> Event ()
enqueueStore Queue si sm so a
q a
a =
(Point -> IO ()) -> Event ()
forall a. (Point -> IO a) -> Event a
Event ((Point -> IO ()) -> Event ()) -> (Point -> IO ()) -> Event ()
forall a b. (a -> b) -> a -> b
$ \Point
p ->
do Point -> Event () -> IO ()
forall a. Point -> Event a -> IO a
invokeEvent Point
p (Event () -> IO ()) -> Event () -> IO ()
forall a b. (a -> b) -> a -> b
$
StrategyQueue sm a -> a -> Event ()
forall s i. EnqueueStrategy s => StrategyQueue s i -> i -> Event ()
strategyEnqueue (Queue si sm so a -> StrategyQueue sm a
forall si sm so a. Queue si sm so a -> StrategyQueue sm a
queueStore Queue si sm so a
q) a
a
Int
c <- IORef Int -> IO Int
forall a. IORef a -> IO a
readIORef (Queue si sm so a -> IORef Int
forall si sm so a. Queue si sm so a -> IORef Int
queueCountRef Queue si sm so a
q)
let c' :: Int
c' = Int
c Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1
Int
c' Int -> IO () -> IO ()
`seq` IORef Int -> Int -> IO ()
forall a. IORef a -> a -> IO ()
writeIORef (Queue si sm so a -> IORef Int
forall si sm so a. Queue si sm so a -> IORef Int
queueCountRef Queue si sm so a
q) Int
c'
Point -> Event () -> IO ()
forall a. Point -> Event a -> IO a
invokeEvent Point
p (Event () -> IO ()) -> Event () -> IO ()
forall a b. (a -> b) -> a -> b
$
Resource so -> Event ()
forall s. DequeueStrategy s => Resource s -> Event ()
releaseResourceWithinEvent (Queue si sm so a -> Resource so
forall si sm so a. Queue si sm so a -> Resource so
dequeueRes Queue si sm so a
q)
enqueueStoreWithPriority :: (PriorityQueueStrategy sm pm,
DequeueStrategy so)
=> Queue si sm so a
-> pm
-> a
-> Event ()
enqueueStoreWithPriority :: Queue si sm so a -> pm -> a -> Event ()
enqueueStoreWithPriority Queue si sm so a
q pm
pm a
a =
(Point -> IO ()) -> Event ()
forall a. (Point -> IO a) -> Event a
Event ((Point -> IO ()) -> Event ()) -> (Point -> IO ()) -> Event ()
forall a b. (a -> b) -> a -> b
$ \Point
p ->
do Point -> Event () -> IO ()
forall a. Point -> Event a -> IO a
invokeEvent Point
p (Event () -> IO ()) -> Event () -> IO ()
forall a b. (a -> b) -> a -> b
$
StrategyQueue sm a -> pm -> a -> Event ()
forall s p i.
PriorityQueueStrategy s p =>
StrategyQueue s i -> p -> i -> Event ()
strategyEnqueueWithPriority (Queue si sm so a -> StrategyQueue sm a
forall si sm so a. Queue si sm so a -> StrategyQueue sm a
queueStore Queue si sm so a
q) pm
pm a
a
Int
c <- IORef Int -> IO Int
forall a. IORef a -> IO a
readIORef (Queue si sm so a -> IORef Int
forall si sm so a. Queue si sm so a -> IORef Int
queueCountRef Queue si sm so a
q)
let c' :: Int
c' = Int
c Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1
Int
c' Int -> IO () -> IO ()
`seq` IORef Int -> Int -> IO ()
forall a. IORef a -> a -> IO ()
writeIORef (Queue si sm so a -> IORef Int
forall si sm so a. Queue si sm so a -> IORef Int
queueCountRef Queue si sm so a
q) Int
c'
Point -> Event () -> IO ()
forall a. Point -> Event a -> IO a
invokeEvent Point
p (Event () -> IO ()) -> Event () -> IO ()
forall a b. (a -> b) -> a -> b
$
Resource so -> Event ()
forall s. DequeueStrategy s => Resource s -> Event ()
releaseResourceWithinEvent (Queue si sm so a -> Resource so
forall si sm so a. Queue si sm so a -> Resource so
dequeueRes Queue si sm so a
q)
dequeueExtract :: (DequeueStrategy si,
DequeueStrategy sm)
=> Queue si sm so a
-> Event a
Queue si sm so a
q =
(Point -> IO a) -> Event a
forall a. (Point -> IO a) -> Event a
Event ((Point -> IO a) -> Event a) -> (Point -> IO a) -> Event a
forall a b. (a -> b) -> a -> b
$ \Point
p ->
do a
a <- Point -> Event a -> IO a
forall a. Point -> Event a -> IO a
invokeEvent Point
p (Event a -> IO a) -> Event a -> IO a
forall a b. (a -> b) -> a -> b
$
StrategyQueue sm a -> Event a
forall s i. DequeueStrategy s => StrategyQueue s i -> Event i
strategyDequeue (Queue si sm so a -> StrategyQueue sm a
forall si sm so a. Queue si sm so a -> StrategyQueue sm a
queueStore Queue si sm so a
q)
Point -> Event a -> IO a
forall a. Point -> Event a -> IO a
invokeEvent Point
p (Event a -> IO a) -> Event a -> IO a
forall a b. (a -> b) -> a -> b
$
Queue si sm so a -> a -> Event a
forall si sm so a.
(DequeueStrategy si, DequeueStrategy sm) =>
Queue si sm so a -> a -> Event a
dequeuePostExtract Queue si sm so a
q a
a
dequeuePostExtract :: (DequeueStrategy si,
DequeueStrategy sm)
=> Queue si sm so a
-> a
-> Event a
Queue si sm so a
q a
a =
(Point -> IO a) -> Event a
forall a. (Point -> IO a) -> Event a
Event ((Point -> IO a) -> Event a) -> (Point -> IO a) -> Event a
forall a b. (a -> b) -> a -> b
$ \Point
p ->
do Int
c <- IORef Int -> IO Int
forall a. IORef a -> IO a
readIORef (Queue si sm so a -> IORef Int
forall si sm so a. Queue si sm so a -> IORef Int
queueCountRef Queue si sm so a
q)
let c' :: Int
c' = Int
c Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1
Int
c' Int -> IO () -> IO ()
`seq` IORef Int -> Int -> IO ()
forall a. IORef a -> a -> IO ()
writeIORef (Queue si sm so a -> IORef Int
forall si sm so a. Queue si sm so a -> IORef Int
queueCountRef Queue si sm so a
q) Int
c'
Point -> Event () -> IO ()
forall a. Point -> Event a -> IO a
invokeEvent Point
p (Event () -> IO ()) -> Event () -> IO ()
forall a b. (a -> b) -> a -> b
$
Resource si -> Event ()
forall s. DequeueStrategy s => Resource s -> Event ()
releaseResourceWithinEvent (Queue si sm so a -> Resource si
forall si sm so a. Queue si sm so a -> Resource si
enqueueRes Queue si sm so a
q)
a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return a
a