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