- class Monad m => MonadTime m t | m -> t where
- getCurrentTime :: m t
- class Monad m => MonadSimControl m where
- class Monad m => MonadEvent m e | e -> m where
- class (MonadEvent m e, MonadTime m t) => ScheduleEvent m t e | m -> t, e -> m where
- class MonadTime m t => CancelEvent m t | m -> t where
- class MonadTime m t => GetCurrentEvent m t | m -> t where
- class MonadTime m t => RetryEvent m t | m -> t where
- class MonadTime m t => MonadEventQueueInfo m t | m -> t where
A type-class for monads with a concept of time. That concept need not necessarily meet any prior conditions - not even an Eq instance.
A monad in which there is a concept of running and not-running and unrestricted operations for switching between them.
A monad in which there is a concept of an "event" - an action with a sort of a special status, which can be described for humans and can be otherwise manipulated in monads implementing the classes to follow.
|Monad m => MonadEvent m (AdHocEvent m)|
|MonadSimControl m => MonadEvent m (SimControl m)|
|(MonadIO m, RealFrac t, Pretty t) => MonadEvent (EventT t m) (SetDebugHandlers t m)|
|(Monad m, Pretty t) => MonadEvent (EventT t m) (EventDescriptor (EventT t m) t)|
|Monad m => MonadEvent (EventT t m) (EventT t m a)|
A monad which can schedule events for later execution. For obvious reasons, such a monad must also have a concept of events (covering the event that the user is trying to schedule) and a concept of time.
Schedule an event for execution at a time (relative to the current time).
The meaning of "relative to" is left entirely up to the
implementor, however it will generally be the case that time is
an instance of
Num and that "relative to" means something
along the lines of "at now + _".
EventID that can be used to identify the event
if needed later (for example, to cancel it).
schedule an event to run at the current time. This does not constitute a promise to execute immediately or in any particular order relative to other events that have been or will be scheduled for the current time.
If an implementor has a time type which is an instance of
doNext should be equivalent to
scheduleEventIn 0 - unless the
monad's documentation clearly warns to the contrary in a really big
typeface. ; ) Note that this clause may change to also strongly
doNext put its event at the very front of the queue
(ie, before any other events already scheduled for the current time).
A monad in which an event (presumably one previously scheduled) can be canceled.
A monad in which an
EventDescriptor for the currently-executing
event, if any, can be obtained.
A monad in which the currently executing event can be rescheduled.
Note that calling
retryEventIn does not terminate the currently
executing event - although perhaps it should. Until a more permanent
decision is made, it's probably best to make
retryEventIn the last
action of an event when it is used, to minimize impact of future changes.
A monad in which information about the event queue can be retrieved.
Return the number of events currently scheduled.
Return a list of (some or all of) the events coming up. There is no obligation on the part of the monad to provide anything at all.