aivika 5.5 → 5.6
raw patch · 9 files changed
+84/−44 lines, 9 filesdep +semigroupsPVP ok
version bump matches the API change (PVP)
Dependencies added: semigroups
API changes (from Hackage documentation)
- Simulation.Aivika.Signal: instance GHC.Base.Monoid a => GHC.Base.Monoid (Simulation.Aivika.Signal.Signalable a)
+ Simulation.Aivika.Internal.Event: instance Data.Semigroup.Semigroup Simulation.Aivika.Internal.Event.DisposableEvent
+ Simulation.Aivika.Results: instance Data.Semigroup.Semigroup Simulation.Aivika.Results.ResultSignal
+ Simulation.Aivika.Results: instance Data.Semigroup.Semigroup Simulation.Aivika.Results.Results
+ Simulation.Aivika.Signal: instance (GHC.Base.Monoid a, Data.Semigroup.Semigroup a) => GHC.Base.Monoid (Simulation.Aivika.Signal.Signalable a)
+ Simulation.Aivika.Signal: instance Data.Semigroup.Semigroup (Simulation.Aivika.Signal.Signal a)
+ Simulation.Aivika.Signal: instance Data.Semigroup.Semigroup a => Data.Semigroup.Semigroup (Simulation.Aivika.Signal.Signalable a)
+ Simulation.Aivika.Statistics: instance Simulation.Aivika.Statistics.SamplingData a => Data.Semigroup.Semigroup (Simulation.Aivika.Statistics.SamplingStats a)
+ Simulation.Aivika.Stream: instance Data.Semigroup.Semigroup (Simulation.Aivika.Stream.Stream a)
- Simulation.Aivika.QueueStrategy: class DequeueStrategy s => DeletingQueueStrategy s where strategyQueueDelete s i = fmap isJust $ strategyQueueDeleteBy s (== i) strategyQueueContains s i = fmap isJust $ strategyQueueContainsBy s (== i)
+ Simulation.Aivika.QueueStrategy: class DequeueStrategy s => DeletingQueueStrategy s
- Simulation.Aivika.QueueStrategy: class QueueStrategy s where data StrategyQueue s :: * -> * where {
+ Simulation.Aivika.QueueStrategy: class QueueStrategy s where {
- Simulation.Aivika.Results: class ResultProvider p 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.Results: class ResultProvider p
- Simulation.Aivika.Signal: appendSignalable :: Monoid a => Signalable a -> Signalable a -> Signalable a
+ Simulation.Aivika.Signal: appendSignalable :: Semigroup a => Signalable a -> Signalable a -> Signalable a
- Simulation.Aivika.Unboxed: class MArray IOUArray e IO => Unboxed e where newUnboxedArray_ = newArray_
+ Simulation.Aivika.Unboxed: class MArray IOUArray e IO => Unboxed e
Files
- CHANGELOG.md +5/−0
- Simulation/Aivika/Internal/Event.hs +6/−2
- Simulation/Aivika/Results.hs +25/−20
- Simulation/Aivika/Signal.hs +23/−13
- Simulation/Aivika/Statistics.hs +6/−2
- Simulation/Aivika/Stream.hs +10/−2
- Simulation/Aivika/SystemDynamics.hs +2/−0
- aivika.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/Internal/Event.hs view
@@ -60,7 +60,8 @@ traceEvent) where import Data.IORef-import Data.Monoid+import Data.Monoid hiding ((<>))+import Data.Semigroup (Semigroup(..)) import Control.Exception import Control.Monad@@ -423,10 +424,13 @@ -- ^ Dispose something within the 'Event' computation. } +instance Semigroup DisposableEvent where+ DisposableEvent x <> DisposableEvent y = DisposableEvent $ x >> y+ instance Monoid DisposableEvent where mempty = DisposableEvent $ return ()- 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.
Simulation/Aivika/Results.hs view
@@ -109,7 +109,8 @@ import Data.Ix import Data.Maybe-import Data.Monoid+import Data.Monoid hiding ((<>))+import Data.Semigroup (Semigroup(..)) import Simulation.Aivika.Parameter import Simulation.Aivika.Simulation@@ -607,27 +608,29 @@ | ResultSignalMix (Signal ()) -- ^ When the specified signal was combined with unknown signal. -instance Monoid ResultSignal where+instance Semigroup ResultSignal where+ (<>) EmptyResultSignal z = z - mempty = EmptyResultSignal+ (<>) UnknownResultSignal EmptyResultSignal = UnknownResultSignal+ (<>) UnknownResultSignal UnknownResultSignal = UnknownResultSignal+ (<>) UnknownResultSignal (ResultSignal x) = ResultSignalMix x+ (<>) UnknownResultSignal z@(ResultSignalMix x) = z - mappend EmptyResultSignal z = 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) - 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)+ (<>) 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 Monoid ResultSignal where++ mempty = EmptyResultSignal+ mappend = (<>)+ -- | Construct a new result signal by the specified optional pure signal. maybeResultSignal :: Maybe (Signal ()) -> ResultSignal maybeResultSignal (Just x) = ResultSignal x@@ -1099,11 +1102,13 @@ return ResultPredefinedSignals { resultSignalInIntegTimes = signalInIntegTimes, resultSignalInStartTime = signalInStartTime, resultSignalInStopTime = signalInStopTime }+instance Semigroup Results where+ x <> y = results $ resultSourceList x <> resultSourceList y instance Monoid Results where - mempty = results mempty- mappend x y = results $ resultSourceList x <> resultSourceList y+ mempty = results mempty+ mappend = (<>) -- | Prepare the simulation results. results :: [ResultSource] -> Results
Simulation/Aivika/Signal.hs view
@@ -60,7 +60,9 @@ traceSignal) where import Data.IORef-import Data.Monoid+import Data.Monoid hiding ((<>))+import Data.Semigroup (Semigroup(..))+import Data.List.NonEmpty (NonEmpty((:|))) import Data.List import Data.Array @@ -167,21 +169,26 @@ instance Functor Signal where fmap = mapSignal- ++instance Semigroup (Signal a) where+ (<>) = merge2Signals++ 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 Monoid (Signal a) where mempty = emptySignal - mappend = merge2Signals+ mappend = (<>) 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 (h : t) = sconcat (h :| t) -- | Map the signal according the specified function. mapSignal :: (a -> b) -> Signal a -> Signal b@@ -385,10 +392,13 @@ instance Functor Signalable where fmap f x = x { readSignalable = fmap f (readSignalable x) } -instance Monoid a => Monoid (Signalable a) where+instance Semigroup a => Semigroup (Signalable a) where+ (<>) = appendSignalable +instance (Monoid a, Semigroup a) => Monoid (Signalable a) where+ mempty = emptySignalable- mappend = appendSignalable+ mappend = (<>) -- | Return an identity. emptySignalable :: Monoid a => Signalable a@@ -397,7 +407,7 @@ signalableChanged_ = mempty } -- | An associative operation.-appendSignalable :: Monoid a => Signalable a -> Signalable a -> Signalable a+appendSignalable :: Semigroup a => Signalable a -> Signalable a -> Signalable a appendSignalable m1 m2 = Signalable { readSignalable = liftM2 (<>) (readSignalable m1) (readSignalable m2), signalableChanged_ = (signalableChanged_ m1) <> (signalableChanged_ m2) }
Simulation/Aivika/Statistics.hs view
@@ -50,7 +50,8 @@ import Control.DeepSeq -import Data.Monoid+import Data.Monoid hiding ((<>))+import Data.Semigroup (Semigroup(..)) import Data.Typeable import Data.Binary @@ -97,11 +98,14 @@ -- | Combine two statistics. combineSamplingStats :: SamplingStats a -> SamplingStats a -> SamplingStats a +instance SamplingData a => Semigroup (SamplingStats a) where+ (<>) = combineSamplingStats+ instance SamplingData a => Monoid (SamplingStats a) where mempty = emptySamplingStats - mappend = combineSamplingStats+ mappend = (<>) instance SamplingData Double where
Simulation/Aivika/Stream.hs view
@@ -83,7 +83,9 @@ import Data.IORef 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@@ -123,11 +125,17 @@ (<|>) = mergeStreams +instance Semigroup (Stream a) where++ (<>) = mergeStreams++ sconcat (h :| t) = concatStreams (h : t)+ instance Monoid (Stream a) where mempty = emptyStream - mappend = mergeStreams+ mappend = (<>) mconcat = concatStreams
Simulation/Aivika/SystemDynamics.hs view
@@ -660,6 +660,7 @@ -- -- | Return the delayed value using the specified lag time.+-- This function is less accurate than 'delayByDT'. delay :: Dynamics a -- ^ the value to delay -> Dynamics Double -- ^ the lag time -> Dynamics a -- ^ the delayed value@@ -688,6 +689,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 :: Dynamics a -- ^ the value to delay -> Dynamics Double -- ^ the lag time -> Dynamics a -- ^ the initial value
aivika.cabal view
@@ -1,5 +1,5 @@ name: aivika-version: 5.5+version: 5.6 synopsis: A multi-method simulation library description: Aivika is a discrete event simulation (DES) framework with support of activity-oriented,@@ -238,7 +238,8 @@ mwc-random >= 0.13.0.0, vector >= 0.10.0.1, deepseq >= 1.1.0.0,- binary >= 0.6.4.0+ binary >= 0.6.4.0,+ semigroups >= 0.10 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