-- |
-- Module     : Simulation.Aivika.Internal.Arrival
-- Copyright  : Copyright (c) 2009-2017, David Sorokin <david.sorokin@gmail.com>
-- License    : BSD3
-- Maintainer : David Sorokin <david.sorokin@gmail.com>
-- Stability  : experimental
-- Tested with: GHC 8.0.1
--
-- This module defines the types and functions for working with the events
-- that can represent something that arrive from outside the model, or
-- represent other things which computation is delayed and hence is not synchronized.
--
-- Therefore, the additional information is provided about the time and delay of arrival.

module Simulation.Aivika.Internal.Arrival
       (Arrival(..)) where

import Simulation.Aivika.Event

-- | It defines when an event has arrived, usually generated by some random stream.
--
-- Such events should arrive one by one without time lag in the following sense
-- that the model should start awaiting the next event exactly in that time
-- when the previous event has arrived.
--
-- Another use case is a situation when the actual event is not synchronized with
-- the 'Event' computation, being synchronized with the event queue, nevertheless.
-- Then the arrival is used for providing the additional information about the time
-- at which the event had been actually arrived.
data Arrival a =
  Arrival { forall a. Arrival a -> a
arrivalValue :: a,
            -- ^ the data we received with the event
            forall a. Arrival a -> Double
arrivalTime :: Double,
            -- ^ the simulation time at which the event has arrived
            forall a. Arrival a -> Maybe Double
arrivalDelay :: Maybe Double
            -- ^ the delay time which has passed from the time of
            -- arriving the previous event
          } deriving (Arrival a -> Arrival a -> Bool
(Arrival a -> Arrival a -> Bool)
-> (Arrival a -> Arrival a -> Bool) -> Eq (Arrival a)
forall a. Eq a => Arrival a -> Arrival a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => Arrival a -> Arrival a -> Bool
== :: Arrival a -> Arrival a -> Bool
$c/= :: forall a. Eq a => Arrival a -> Arrival a -> Bool
/= :: Arrival a -> Arrival a -> Bool
Eq, Eq (Arrival a)
Eq (Arrival a) =>
(Arrival a -> Arrival a -> Ordering)
-> (Arrival a -> Arrival a -> Bool)
-> (Arrival a -> Arrival a -> Bool)
-> (Arrival a -> Arrival a -> Bool)
-> (Arrival a -> Arrival a -> Bool)
-> (Arrival a -> Arrival a -> Arrival a)
-> (Arrival a -> Arrival a -> Arrival a)
-> Ord (Arrival a)
Arrival a -> Arrival a -> Bool
Arrival a -> Arrival a -> Ordering
Arrival a -> Arrival a -> Arrival a
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a. Ord a => Eq (Arrival a)
forall a. Ord a => Arrival a -> Arrival a -> Bool
forall a. Ord a => Arrival a -> Arrival a -> Ordering
forall a. Ord a => Arrival a -> Arrival a -> Arrival a
$ccompare :: forall a. Ord a => Arrival a -> Arrival a -> Ordering
compare :: Arrival a -> Arrival a -> Ordering
$c< :: forall a. Ord a => Arrival a -> Arrival a -> Bool
< :: Arrival a -> Arrival a -> Bool
$c<= :: forall a. Ord a => Arrival a -> Arrival a -> Bool
<= :: Arrival a -> Arrival a -> Bool
$c> :: forall a. Ord a => Arrival a -> Arrival a -> Bool
> :: Arrival a -> Arrival a -> Bool
$c>= :: forall a. Ord a => Arrival a -> Arrival a -> Bool
>= :: Arrival a -> Arrival a -> Bool
$cmax :: forall a. Ord a => Arrival a -> Arrival a -> Arrival a
max :: Arrival a -> Arrival a -> Arrival a
$cmin :: forall a. Ord a => Arrival a -> Arrival a -> Arrival a
min :: Arrival a -> Arrival a -> Arrival a
Ord, Int -> Arrival a -> ShowS
[Arrival a] -> ShowS
Arrival a -> String
(Int -> Arrival a -> ShowS)
-> (Arrival a -> String)
-> ([Arrival a] -> ShowS)
-> Show (Arrival a)
forall a. Show a => Int -> Arrival a -> ShowS
forall a. Show a => [Arrival a] -> ShowS
forall a. Show a => Arrival a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> Arrival a -> ShowS
showsPrec :: Int -> Arrival a -> ShowS
$cshow :: forall a. Show a => Arrival a -> String
show :: Arrival a -> String
$cshowList :: forall a. Show a => [Arrival a] -> ShowS
showList :: [Arrival a] -> ShowS
Show)