module Simulation.Aivika.Trans.GPSS.Block.Split
(splitBlock) where
import Simulation.Aivika.Trans
import Simulation.Aivika.Trans.GPSS.Block
import Simulation.Aivika.Trans.GPSS.Transact
splitBlock :: MonadDES m
=> [Block m (Transact m a) ()]
-> Block m (Transact m a) (Transact m a)
{-# INLINABLE splitBlock #-}
splitBlock :: forall (m :: * -> *) a.
MonadDES m =>
[Block m (Transact m a) ()]
-> Block m (Transact m a) (Transact m a)
splitBlock [Block m (Transact m a) ()]
blocks =
Block { blockProcess :: Transact m a -> Process m (Transact m a)
blockProcess = \Transact m a
a ->
do let loop :: [Block m (Transact m a) ()] -> Event m ()
loop [] = forall (m :: * -> *) a. Monad m => a -> m a
return ()
loop (Block m (Transact m a) ()
transfer: [Block m (Transact m a) ()]
transfers) =
do Transact m a
a' <- forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
SimulationLift t m =>
Simulation m a -> t m a
liftSimulation forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a.
MonadDES m =>
Transact m a -> Simulation m (Transact m a)
splitTransact Transact m a
a
forall (m :: * -> *) a.
MonadDES m =>
Transact m a -> Process m () -> Event m ()
transferTransact Transact m a
a' forall a b. (a -> b) -> a -> b
$
forall (m :: * -> *) a b. Block m a b -> a -> Process m b
blockProcess Block m (Transact m a) ()
transfer Transact m a
a'
[Block m (Transact m a) ()] -> Event m ()
loop [Block m (Transact m a) ()]
transfers
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
EventLift t m =>
Event m a -> t m a
liftEvent forall a b. (a -> b) -> a -> b
$ [Block m (Transact m a) ()] -> Event m ()
loop [Block m (Transact m a) ()]
blocks
forall (m :: * -> *) a. Monad m => a -> m a
return Transact m a
a
}