aivika-gpss 0.4 → 0.5
raw patch · 5 files changed
+99/−3 lines, 5 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Simulation.Aivika.GPSS.Block: processBlock :: (a -> Process b) -> Block a b
+ Simulation.Aivika.GPSS.Block.Generate: signalGeneratorBlock :: Signal (Arrival a) -> Int -> GeneratorBlock (Transact a)
+ Simulation.Aivika.GPSS.Block.Generate: signalGeneratorBlock0 :: Signal (Arrival a) -> GeneratorBlock (Transact a)
+ Simulation.Aivika.GPSS.Block.Generate: signalGeneratorBlockM :: Signal (Arrival a) -> Event Int -> GeneratorBlock (Transact a)
+ Simulation.Aivika.Trans.GPSS.Block: processBlock :: MonadDES m => (a -> Process m b) -> Block m a b
+ Simulation.Aivika.Trans.GPSS.Block.Generate: signalGeneratorBlock :: MonadDES m => Signal m (Arrival a) -> Int -> GeneratorBlock m (Transact m a)
+ Simulation.Aivika.Trans.GPSS.Block.Generate: signalGeneratorBlock0 :: MonadDES m => Signal m (Arrival a) -> GeneratorBlock m (Transact m a)
+ Simulation.Aivika.Trans.GPSS.Block.Generate: signalGeneratorBlockM :: MonadDES m => Signal m (Arrival a) -> Event m Int -> GeneratorBlock m (Transact m a)
Files
- Simulation/Aivika/GPSS/Block.hs +7/−0
- Simulation/Aivika/GPSS/Block/Generate.hs +38/−1
- Simulation/Aivika/Trans/GPSS/Block.hs +9/−0
- Simulation/Aivika/Trans/GPSS/Block/Generate.hs +44/−1
- aivika-gpss.cabal +1/−1
Simulation/Aivika/GPSS/Block.hs view
@@ -13,6 +13,7 @@ (Block(..), GeneratorBlock(..), withinBlock,+ processBlock, traceBlock) where import Control.Monad@@ -46,6 +47,12 @@ -> Block a a withinBlock m = Block { blockProcess = \a -> m >> return a }++-- | Process every transact within the block.+processBlock :: (a -> Process b)+ -- ^ process the transact+ -> Block a b+processBlock = Block -- | Trace the specified block. traceBlock :: String -> Block a b -> Block a b
Simulation/Aivika/GPSS/Block/Generate.hs view
@@ -12,7 +12,10 @@ module Simulation.Aivika.GPSS.Block.Generate (streamGeneratorBlock0, streamGeneratorBlock,- streamGeneratorBlockM) where+ streamGeneratorBlockM,+ signalGeneratorBlock0,+ signalGeneratorBlock,+ signalGeneratorBlockM) where import Simulation.Aivika import Simulation.Aivika.GPSS.Block@@ -49,3 +52,37 @@ -- ^ the input stream of data -> GeneratorBlock (Transact a) streamGeneratorBlock0 s = streamGeneratorBlock s 0++-- | Return a generator block by the specified signal and priority computation.+signalGeneratorBlockM :: Signal (Arrival a)+ -- ^ the input signal of data+ -> Event Int+ -- ^ the transact priority+ -> GeneratorBlock (Transact a)+signalGeneratorBlockM s priority =+ let handle block a =+ do p <- priority+ t <- liftSimulation $ newTransact a p+ runProcess $+ do takeTransact t+ blockProcess block t+ in GeneratorBlock $ \block ->+ do h <- liftEvent $+ handleSignal s $+ handle block+ finallyProcess neverProcess+ (liftEvent $ disposeEvent h)++-- | Return a generator block by the specified signal and priority.+signalGeneratorBlock :: Signal (Arrival a)+ -- ^ the input signal of data+ -> Int+ -- ^ the transact priority+ -> GeneratorBlock (Transact a)+signalGeneratorBlock s = signalGeneratorBlockM s . return++-- | Return a generator block by the specified signal using zero priority.+signalGeneratorBlock0 :: Signal (Arrival a)+ -- ^ the input signal of data+ -> GeneratorBlock (Transact a)+signalGeneratorBlock0 s = signalGeneratorBlock s 0
Simulation/Aivika/Trans/GPSS/Block.hs view
@@ -13,6 +13,7 @@ (Block(..), GeneratorBlock(..), withinBlock,+ processBlock, traceBlock) where import Control.Monad@@ -50,6 +51,14 @@ {-# INLINABLE withinBlock #-} withinBlock m = Block { blockProcess = \a -> m >> return a }++-- | Process every transact within the block.+processBlock :: MonadDES m+ => (a -> Process m b)+ -- ^ process the transact+ -> Block m a b+{-# INLINABLE processBlock #-}+processBlock = Block -- | Trace the specified block. traceBlock :: MonadDES m => String -> Block m a b -> Block m a b
Simulation/Aivika/Trans/GPSS/Block/Generate.hs view
@@ -12,7 +12,10 @@ module Simulation.Aivika.Trans.GPSS.Block.Generate (streamGeneratorBlock0, streamGeneratorBlock,- streamGeneratorBlockM) where+ streamGeneratorBlockM,+ signalGeneratorBlock0,+ signalGeneratorBlock,+ signalGeneratorBlockM) where import Simulation.Aivika.Trans import Simulation.Aivika.Trans.GPSS.Block@@ -55,3 +58,43 @@ -> GeneratorBlock m (Transact m a) {-# INLINABLE streamGeneratorBlock0 #-} streamGeneratorBlock0 s = streamGeneratorBlock s 0++-- | Return a generator block by the specified signal and priority computation.+signalGeneratorBlockM :: MonadDES m+ => Signal m (Arrival a)+ -- ^ the input signal of data+ -> Event m Int+ -- ^ the transact priority+ -> GeneratorBlock m (Transact m a)+{-# INLINABLE signalGeneratorBlockM #-}+signalGeneratorBlockM s priority =+ let handle block a =+ do p <- priority+ t <- liftSimulation $ newTransact a p+ runProcess $+ do takeTransact t+ blockProcess block t+ in GeneratorBlock $ \block ->+ do h <- liftEvent $+ handleSignal s $+ handle block+ finallyProcess neverProcess+ (liftEvent $ disposeEvent h)++-- | Return a generator block by the specified signal and priority.+signalGeneratorBlock :: MonadDES m+ => Signal m (Arrival a)+ -- ^ the input signal of data+ -> Int+ -- ^ the transact priority+ -> GeneratorBlock m (Transact m a)+{-# INLINABLE signalGeneratorBlock #-}+signalGeneratorBlock s = signalGeneratorBlockM s . return++-- | Return a generator block by the specified signal using zero priority.+signalGeneratorBlock0 :: MonadDES m+ => Signal m (Arrival a)+ -- ^ the input signal of data+ -> GeneratorBlock m (Transact m a)+{-# INLINABLE signalGeneratorBlock0 #-}+signalGeneratorBlock0 s = signalGeneratorBlock s 0
aivika-gpss.cabal view
@@ -1,5 +1,5 @@ name: aivika-gpss-version: 0.4+version: 0.5 synopsis: GPSS-like DSL for Aivika description: This package allows defining simulation models in terms of a GPSS-like