aivika-transformers 5.5 → 5.6
raw patch · 8 files changed
+89/−41 lines, 8 filesdep +semigroupsdep ~aivikaPVP ok
version bump matches the API change (PVP)
Dependencies added: semigroups
Dependency ranges changed: aivika
API changes (from Hackage documentation)
- Simulation.Aivika.Trans.Signal: instance (Simulation.Aivika.Trans.DES.MonadDES m, GHC.Base.Monoid a) => GHC.Base.Monoid (Simulation.Aivika.Trans.Signal.Signalable m a)
+ Simulation.Aivika.Trans.Internal.Event: instance GHC.Base.Monad m => Data.Semigroup.Semigroup (Simulation.Aivika.Trans.Internal.Event.DisposableEvent m)
+ Simulation.Aivika.Trans.Results: instance Data.Semigroup.Semigroup (Simulation.Aivika.Trans.Results.Results m)
+ Simulation.Aivika.Trans.Results: instance Simulation.Aivika.Trans.DES.MonadDES m => Data.Semigroup.Semigroup (Simulation.Aivika.Trans.Results.ResultSignal m)
+ Simulation.Aivika.Trans.Signal: instance (Simulation.Aivika.Trans.DES.MonadDES m, Data.Semigroup.Semigroup a) => Data.Semigroup.Semigroup (Simulation.Aivika.Trans.Signal.Signalable m a)
+ Simulation.Aivika.Trans.Signal: instance (Simulation.Aivika.Trans.DES.MonadDES m, GHC.Base.Monoid a, Data.Semigroup.Semigroup a) => GHC.Base.Monoid (Simulation.Aivika.Trans.Signal.Signalable m a)
+ Simulation.Aivika.Trans.Signal: instance Simulation.Aivika.Trans.DES.MonadDES m => Data.Semigroup.Semigroup (Simulation.Aivika.Trans.Signal.Signal m a)
+ Simulation.Aivika.Trans.Stream: instance Simulation.Aivika.Trans.DES.MonadDES m => Data.Semigroup.Semigroup (Simulation.Aivika.Trans.Stream.Stream m a)
- Simulation.Aivika.Trans.Event: class EventQueueing m where data EventQueue m :: * runEvent = runEventWith CurrentEvents where {
+ Simulation.Aivika.Trans.Event: class EventQueueing m where {
- Simulation.Aivika.Trans.Generator: class (Functor m, Monad m) => MonadGenerator m where data Generator m :: * where {
+ Simulation.Aivika.Trans.Generator: class (Functor m, Monad m) => MonadGenerator m where {
- Simulation.Aivika.Trans.Internal.Event: class EventQueueing m where data EventQueue m :: * runEvent = runEventWith CurrentEvents where {
+ Simulation.Aivika.Trans.Internal.Event: class EventQueueing m where {
- Simulation.Aivika.Trans.Internal.Types: class EventQueueing m where data EventQueue m :: * runEvent = runEventWith CurrentEvents where {
+ Simulation.Aivika.Trans.Internal.Types: class EventQueueing m where {
- Simulation.Aivika.Trans.QueueStrategy: class DequeueStrategy m s => DeletingQueueStrategy m s where strategyQueueDelete s a = Event $ \ p -> do { x <- invokeEvent p $ strategyQueueDeleteBy s (== a); return (isJust x) } strategyQueueContains s a = Event $ \ p -> do { x <- invokeEvent p $ strategyQueueContainsBy s (== a); return (isJust x) }
+ Simulation.Aivika.Trans.QueueStrategy: class DequeueStrategy m s => DeletingQueueStrategy m s
- Simulation.Aivika.Trans.QueueStrategy: class Monad m => QueueStrategy m s where data StrategyQueue m s :: * -> * where {
+ Simulation.Aivika.Trans.QueueStrategy: class Monad m => QueueStrategy m s where {
- Simulation.Aivika.Trans.Ref.Base.Lazy: class Monad m => MonadRef m where data Ref m a where {
+ Simulation.Aivika.Trans.Ref.Base.Lazy: class Monad m => MonadRef m where {
- Simulation.Aivika.Trans.Ref.Base.Strict: class Monad m => MonadRef m where data Ref m a where {
+ Simulation.Aivika.Trans.Ref.Base.Strict: class Monad m => MonadRef m where {
- Simulation.Aivika.Trans.Resource.Preemption: class MonadDES m => MonadResource m where data Resource m where {
+ Simulation.Aivika.Trans.Resource.Preemption: class MonadDES m => MonadResource m where {
- Simulation.Aivika.Trans.Resource.Preemption.Base: class MonadDES m => MonadResource m where data Resource m where {
+ Simulation.Aivika.Trans.Resource.Preemption.Base: class MonadDES m => MonadResource m where {
- Simulation.Aivika.Trans.Results: class MonadDES m => ResultProvider p m | p -> m where resultSource name descr = resultSource' name [name] i [i] where i = (UserDefinedResultId $ UserDefinedResult name descr title) title = resultNameToTitle name resultSource3 name descr title = resultSource' name [name] i [i] where i = (UserDefinedResultId $ UserDefinedResult name descr title)
+ Simulation.Aivika.Trans.Results: class MonadDES m => ResultProvider p m | p -> m
- Simulation.Aivika.Trans.Signal: appendSignalable :: (MonadDES m, Monoid a) => Signalable m a -> Signalable m a -> Signalable m a
+ Simulation.Aivika.Trans.Signal: appendSignalable :: (MonadDES m, Semigroup a) => Signalable m a -> Signalable m a -> Signalable m a
- Simulation.Aivika.Trans.Statistics: SamplingStats :: ~Int -> ~a -> ~a -> ~Double -> ~Double -> SamplingStats a
+ Simulation.Aivika.Trans.Statistics: SamplingStats :: !Int -> !a -> !a -> !Double -> !Double -> SamplingStats a
- Simulation.Aivika.Trans.Statistics: TimingStats :: ~Int -> ~a -> ~a -> ~a -> ~Double -> ~Double -> ~Double -> ~Double -> ~Double -> ~Double -> TimingStats a
+ Simulation.Aivika.Trans.Statistics: TimingStats :: !Int -> !a -> !a -> !a -> !Double -> !Double -> !Double -> !Double -> !Double -> !Double -> TimingStats a
- Simulation.Aivika.Trans.Statistics: [samplingStatsCount] :: SamplingStats a -> ~Int
+ Simulation.Aivika.Trans.Statistics: [samplingStatsCount] :: SamplingStats a -> !Int
- Simulation.Aivika.Trans.Statistics: [samplingStatsMax] :: SamplingStats a -> ~a
+ Simulation.Aivika.Trans.Statistics: [samplingStatsMax] :: SamplingStats a -> !a
- Simulation.Aivika.Trans.Statistics: [samplingStatsMean2] :: SamplingStats a -> ~Double
+ Simulation.Aivika.Trans.Statistics: [samplingStatsMean2] :: SamplingStats a -> !Double
- Simulation.Aivika.Trans.Statistics: [samplingStatsMean] :: SamplingStats a -> ~Double
+ Simulation.Aivika.Trans.Statistics: [samplingStatsMean] :: SamplingStats a -> !Double
- Simulation.Aivika.Trans.Statistics: [samplingStatsMin] :: SamplingStats a -> ~a
+ Simulation.Aivika.Trans.Statistics: [samplingStatsMin] :: SamplingStats a -> !a
- Simulation.Aivika.Trans.Statistics: [timingStatsCount] :: TimingStats a -> ~Int
+ Simulation.Aivika.Trans.Statistics: [timingStatsCount] :: TimingStats a -> !Int
- Simulation.Aivika.Trans.Statistics: [timingStatsLastTime] :: TimingStats a -> ~Double
+ Simulation.Aivika.Trans.Statistics: [timingStatsLastTime] :: TimingStats a -> !Double
- Simulation.Aivika.Trans.Statistics: [timingStatsLast] :: TimingStats a -> ~a
+ Simulation.Aivika.Trans.Statistics: [timingStatsLast] :: TimingStats a -> !a
- Simulation.Aivika.Trans.Statistics: [timingStatsMaxTime] :: TimingStats a -> ~Double
+ Simulation.Aivika.Trans.Statistics: [timingStatsMaxTime] :: TimingStats a -> !Double
- Simulation.Aivika.Trans.Statistics: [timingStatsMax] :: TimingStats a -> ~a
+ Simulation.Aivika.Trans.Statistics: [timingStatsMax] :: TimingStats a -> !a
- Simulation.Aivika.Trans.Statistics: [timingStatsMinTime] :: TimingStats a -> ~Double
+ Simulation.Aivika.Trans.Statistics: [timingStatsMinTime] :: TimingStats a -> !Double
- Simulation.Aivika.Trans.Statistics: [timingStatsMin] :: TimingStats a -> ~a
+ Simulation.Aivika.Trans.Statistics: [timingStatsMin] :: TimingStats a -> !a
- Simulation.Aivika.Trans.Statistics: [timingStatsStartTime] :: TimingStats a -> ~Double
+ Simulation.Aivika.Trans.Statistics: [timingStatsStartTime] :: TimingStats a -> !Double
- Simulation.Aivika.Trans.Statistics: [timingStatsSum2] :: TimingStats a -> ~Double
+ Simulation.Aivika.Trans.Statistics: [timingStatsSum2] :: TimingStats a -> !Double
- Simulation.Aivika.Trans.Statistics: [timingStatsSum] :: TimingStats a -> ~Double
+ Simulation.Aivika.Trans.Statistics: [timingStatsSum] :: TimingStats a -> !Double
- Simulation.Aivika.Trans.Statistics: combineSamplingStatsEither :: SamplingData a => Either a (SamplingStats a) -> SamplingStats a -> SamplingStats a
+ Simulation.Aivika.Trans.Statistics: combineSamplingStatsEither :: SamplingData a => Either a SamplingStats a -> SamplingStats a -> SamplingStats a
- Simulation.Aivika.Trans.Statistics: samplingStatsDeviation :: SamplingStats a -> Double
+ Simulation.Aivika.Trans.Statistics: samplingStatsDeviation :: () => SamplingStats a -> Double
- Simulation.Aivika.Trans.Statistics: samplingStatsVariance :: SamplingStats a -> Double
+ Simulation.Aivika.Trans.Statistics: samplingStatsVariance :: () => SamplingStats a -> Double
- Simulation.Aivika.Trans.Var: class MonadDES m => MonadVar m where data Var m a where {
+ Simulation.Aivika.Trans.Var: class MonadDES m => MonadVar m where {
- Simulation.Aivika.Trans.Var.Unboxed: class MonadDES m => MonadVar m a where data Var m a where {
+ Simulation.Aivika.Trans.Var.Unboxed: class MonadDES m => MonadVar m a where {
Files
- CHANGELOG.md +5/−0
- Simulation/Aivika/Trans/Internal/Event.hs +7/−2
- Simulation/Aivika/Trans/Results.hs +28/−19
- Simulation/Aivika/Trans/Signal.hs +28/−13
- Simulation/Aivika/Trans/Stream.hs +12/−2
- Simulation/Aivika/Trans/SystemDynamics.hs +2/−0
- aivika-transformers.cabal +3/−2
- examples/InspectionAdjustmentStations.hs +4/−3
CHANGELOG.md view
@@ -1,4 +1,9 @@ +Version 5.6+-----++* Lars Kuhtz added the support of GHC 8.4.+ Version 5.5 -----
Simulation/Aivika/Trans/Internal/Event.hs view
@@ -55,7 +55,8 @@ -- * Debugging traceEvent) where -import Data.Monoid+import Data.Monoid hiding ((<>))+import Data.Semigroup (Semigroup(..)) import Control.Exception import Control.Monad@@ -316,13 +317,17 @@ -- ^ Dispose something within the 'Event' computation. } +instance Monad m => Semigroup (DisposableEvent m) where+ {-# INLINE (<>) #-}+ DisposableEvent x <> DisposableEvent y = DisposableEvent $ x >> y+ instance Monad m => Monoid (DisposableEvent m) where {-# INLINE mempty #-} mempty = DisposableEvent $ return () {-# INLINE mappend #-}- mappend (DisposableEvent x) (DisposableEvent y) = DisposableEvent $ x >> y+ mappend = (<>) -- | Retry the current computation as possible, using the specified argument -- as a 'SimulationRetry' exception message in case of failure. It makes sense
Simulation/Aivika/Trans/Results.hs view
@@ -108,7 +108,8 @@ import Data.Ix import Data.Maybe-import Data.Monoid+import Data.Monoid hiding ((<>))+import Data.Semigroup (Semigroup(..)) import Simulation.Aivika.Trans.Parameter import Simulation.Aivika.Trans.Simulation@@ -613,26 +614,30 @@ | ResultSignalMix (Signal m ()) -- ^ When the specified signal was combined with unknown signal. +instance MonadDES m => Semigroup (ResultSignal m) where++ (<>) EmptyResultSignal z = z++ (<>) UnknownResultSignal EmptyResultSignal = UnknownResultSignal+ (<>) UnknownResultSignal UnknownResultSignal = UnknownResultSignal+ (<>) UnknownResultSignal (ResultSignal x) = ResultSignalMix x+ (<>) UnknownResultSignal z@(ResultSignalMix x) = z++ (<>) z@(ResultSignal x) EmptyResultSignal = z+ (<>) (ResultSignal x) UnknownResultSignal = ResultSignalMix x+ (<>) (ResultSignal x) (ResultSignal y) = ResultSignal (x <> y)+ (<>) (ResultSignal x) (ResultSignalMix y) = ResultSignalMix (x <> y)++ (<>) z@(ResultSignalMix x) EmptyResultSignal = z+ (<>) z@(ResultSignalMix x) UnknownResultSignal = z+ (<>) (ResultSignalMix x) (ResultSignal y) = ResultSignalMix (x <> y)+ (<>) (ResultSignalMix x) (ResultSignalMix y) = ResultSignalMix (x <> y)+ instance MonadDES m => Monoid (ResultSignal m) where mempty = EmptyResultSignal - mappend EmptyResultSignal z = z-- mappend UnknownResultSignal EmptyResultSignal = UnknownResultSignal- mappend UnknownResultSignal UnknownResultSignal = UnknownResultSignal- mappend UnknownResultSignal (ResultSignal x) = ResultSignalMix x- mappend UnknownResultSignal z@(ResultSignalMix x) = z- - mappend z@(ResultSignal x) EmptyResultSignal = z- mappend (ResultSignal x) UnknownResultSignal = ResultSignalMix x- mappend (ResultSignal x) (ResultSignal y) = ResultSignal (x <> y)- mappend (ResultSignal x) (ResultSignalMix y) = ResultSignalMix (x <> y)- - mappend z@(ResultSignalMix x) EmptyResultSignal = z- mappend z@(ResultSignalMix x) UnknownResultSignal = z- mappend (ResultSignalMix x) (ResultSignal y) = ResultSignalMix (x <> y)- mappend (ResultSignalMix x) (ResultSignalMix y) = ResultSignalMix (x <> y)+ mappend = (<>) -- | Construct a new result signal by the specified optional pure signal. maybeResultSignal :: Maybe (Signal m ()) -> ResultSignal m@@ -1106,10 +1111,14 @@ resultSignalInStartTime = signalInStartTime, resultSignalInStopTime = signalInStopTime } +instance Semigroup (Results m) where++ x <> y = results $ resultSourceList x <> resultSourceList y+ instance Monoid (Results m) where - mempty = results mempty- mappend x y = results $ resultSourceList x <> resultSourceList y+ mempty = results mempty+ mappend = (<>) -- | Prepare the simulation results. results :: [ResultSource m] -> Results m
Simulation/Aivika/Trans/Signal.hs view
@@ -61,7 +61,9 @@ -- * Debugging traceSignal) where -import Data.Monoid+import Data.Monoid hiding ((<>))+import Data.Semigroup (Semigroup(..))+import Data.List.NonEmpty (NonEmpty((:|))) import Data.List import Data.Array @@ -195,23 +197,31 @@ {-# INLINE fmap #-} fmap = mapSignal +instance MonadDES m => Semigroup (Signal m a) where++ {-# INLINE (<>) #-}+ (<>) = merge2Signals++ {-# INLINABLE sconcat #-}+ sconcat (x1 :| []) = x1+ sconcat (x1 :| [x2]) = merge2Signals x1 x2+ sconcat (x1 :| [x2, x3]) = merge3Signals x1 x2 x3+ sconcat (x1 :| [x2, x3, x4]) = merge4Signals x1 x2 x3 x4+ sconcat (x1 :| [x2, x3, x4, x5]) = merge5Signals x1 x2 x3 x4 x5+ sconcat (x1 :| (x2 : x3 : x4 : x5 : xs)) = + sconcat $ merge5Signals x1 x2 x3 x4 x5 :| xs+ instance MonadDES m => Monoid (Signal m a) where {-# INLINE mempty #-} mempty = emptySignal {-# INLINE mappend #-}- mappend = merge2Signals+ mappend = (<>) {-# INLINABLE mconcat #-}- mconcat [] = emptySignal- mconcat [x1] = x1- mconcat [x1, x2] = merge2Signals x1 x2- mconcat [x1, x2, x3] = merge3Signals x1 x2 x3- mconcat [x1, x2, x3, x4] = merge4Signals x1 x2 x3 x4- mconcat [x1, x2, x3, x4, x5] = merge5Signals x1 x2 x3 x4 x5- mconcat (x1 : x2 : x3 : x4 : x5 : xs) = - mconcat $ merge5Signals x1 x2 x3 x4 x5 : xs+ mconcat [] = mempty+ mconcat (h:t) = sconcat (h :| t) -- | Map the signal according the specified function. mapSignal :: MonadDES m => (a -> b) -> Signal m a -> Signal m b@@ -445,13 +455,18 @@ {-# INLINE fmap #-} fmap f x = x { readSignalable = fmap f (readSignalable x) } -instance (MonadDES m, Monoid a) => Monoid (Signalable m a) where+instance (MonadDES m, Semigroup a) => Semigroup (Signalable m a) where + {-# INLINE (<>) #-}+ (<>) = appendSignalable++instance (MonadDES m, Monoid a, Semigroup a) => Monoid (Signalable m a) where+ {-# INLINE mempty #-} mempty = emptySignalable {-# INLINE mappend #-}- mappend = appendSignalable+ mappend = (<>) -- | Return an identity. emptySignalable :: (MonadDES m, Monoid a) => Signalable m a@@ -461,7 +476,7 @@ signalableChanged_ = mempty } -- | An associative operation.-appendSignalable :: (MonadDES m, Monoid a) => Signalable m a -> Signalable m a -> Signalable m a+appendSignalable :: (MonadDES m, Semigroup a) => Signalable m a -> Signalable m a -> Signalable m a {-# INLINABLE appendSignalable #-} appendSignalable m1 m2 = Signalable { readSignalable = liftM2 (<>) (readSignalable m1) (readSignalable m2),
Simulation/Aivika/Trans/Stream.hs view
@@ -84,7 +84,9 @@ traceStream) where import Data.Maybe-import Data.Monoid+import Data.Monoid hiding ((<>))+import Data.Semigroup (Semigroup(..))+import Data.List.NonEmpty (NonEmpty((:|))) import Control.Applicative import Control.Monad@@ -132,13 +134,21 @@ {-# INLINE (<|>) #-} (<|>) = mergeStreams +instance MonadDES m => Semigroup (Stream m a) where++ {-# INLINE (<>) #-}+ (<>) = mergeStreams++ {-# INLINE sconcat #-}+ sconcat (h :| t) = concatStreams (h : t)+ instance MonadDES m => Monoid (Stream m a) where {-# INLINE mempty #-} mempty = emptyStream {-# INLINE mappend #-}- mappend = mergeStreams+ mappend = (<>) {-# INLINE mconcat #-} mconcat = concatStreams
Simulation/Aivika/Trans/SystemDynamics.hs view
@@ -721,6 +721,7 @@ -- -- | Return the delayed value using the specified lag time.+-- This function is less accurate than 'delayByDT'. delay :: Monad m => Dynamics m a -- ^ the value to delay -> Dynamics m Double -- ^ the lag time@@ -751,6 +752,7 @@ -- | Return the delayed value using the specified lag time and initial value. -- Because of the latter, it allows creating a loop back.+-- This function is less accurate than 'delayIByDT'. delayI :: MonadSD m => Dynamics m a -- ^ the value to delay -> Dynamics m Double -- ^ the lag time
aivika-transformers.cabal view
@@ -1,5 +1,5 @@ name: aivika-transformers-version: 5.5+version: 5.6 synopsis: Transformers for the Aivika simulation library description: This package is a generalization of the aivika [1] simulation library@@ -175,7 +175,8 @@ random >= 1.0.0.3, mwc-random >= 0.13.0.0, vector >= 0.10.0.1,- aivika >= 5.5+ semigroups >= 0.10,+ aivika >= 5.6 other-extensions: FlexibleContexts, FlexibleInstances,
examples/InspectionAdjustmentStations.hs view
@@ -19,9 +19,10 @@ -- The time between arrivals of television sets to the final inspection station is uniformly -- distributed between 3.5 and 7.5 minutes. Two inspectors work side-by-side at the final -- inspection station. The time required to inspect a set is uniformly distributed between --- 6 and 12 minutes. On the average, 85 percent of the sets are routed to the adjustment --- station which is manned by a single worker. Adjustment of the vertical control setting --- requires between 20 and 40 minutes, uniformly distributed.+-- 6 and 12 minutes. On the average, 85 percent of the sets pass inspection and continue on+-- the packing department. The other 15 percent are routed to the adjustment station which is+-- manned by a single worker. Adjustment of the vertical control setting requires between 20+-- and 40 minutes, uniformly distributed. -- -- The inspection station and adjustor are to be simulated for 480 minutes to estimate -- the time to process television sets through the final production stage and to determine