packages feed

event-monad 0.0.2.0 → 0.0.3

raw patch · 6 files changed

+55/−17 lines, 6 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- Control.Monad.Event.BasicEvents: instance (Monad m) => MonadEvent m (AdHocEvent m)
- Control.Monad.Event.BasicEvents: instance (MonadSimControl m) => MonadEvent m (SimControl m)
- Control.Monad.EventM: instance (MonadEvent (EventIO t) e) => ScheduleEvent (EventIO t) t e
- Control.Monad.EventM: instance (Show t) => MonadEvent (EventIO t) (EventDescriptor (EventIO t) t)
- Control.Monad.EventM: instance MonadEvent (EventIO t) (EventIO t a)
- Control.Monad.EventM: instance MonadEvent (EventIO t) (IO a)
- Control.Monad.EventT: instance (Monad m) => Functor (EventT t m)
- Control.Monad.EventT: instance (Monad m) => GetCurrentEvent (EventT t m) t
- Control.Monad.EventT: instance (Monad m) => Monad (EventT t m)
- Control.Monad.EventT: instance (Monad m) => MonadEvent (EventT t m) (EventT t m a)
- Control.Monad.EventT: instance (Monad m) => MonadSimControl (EventT t m)
- Control.Monad.EventT: instance (Monad m) => MonadTime (EventT t m) t
- Control.Monad.EventT: instance (Monad m) => RetryEvent (EventT t m) t
- Control.Monad.EventT: instance (Monad m, Show t) => MonadEvent (EventT t m) (EventDescriptor (EventT t m) t)
- Control.Monad.EventT: instance (MonadCont m) => MonadCont (EventT t m)
- Control.Monad.EventT: instance (MonadError e m) => MonadError e (EventT t m)
- Control.Monad.EventT: instance (MonadFix m) => MonadFix (EventT t m)
- Control.Monad.EventT: instance (MonadIO m) => MonadIO (EventT t m)
- Control.Monad.EventT: instance (MonadPlus m) => MonadPlus (EventT t m)
- Control.Monad.EventT: instance (MonadReader r m) => MonadReader r (EventT t m)
- Control.Monad.EventT: instance (MonadState s m) => MonadState s (EventT t m)
- Control.Monad.EventT: instance (MonadWriter w m) => MonadWriter w (EventT t m)
+ Control.Monad.Event.BasicEvents: instance (Monad m, Typeable1 m) => MonadEvent m (AdHocEvent m)
+ Control.Monad.Event.BasicEvents: instance (MonadSimControl m, Typeable1 m) => MonadEvent m (SimControl m)
+ Control.Monad.Event.BasicEvents: instance Typeable1 m => Typeable (AdHocEvent m)
+ Control.Monad.Event.BasicEvents: instance Typeable1 m => Typeable (SimControl m)
+ Control.Monad.EventM: data EventIOState t
+ Control.Monad.EventM: instance (Typeable a, Typeable t) => MonadEvent (EventIO t) (EventIO t a)
+ Control.Monad.EventM: instance (Typeable a, Typeable t) => MonadEvent (EventIO t) (IO a)
+ Control.Monad.EventM: instance (Typeable t, Show t) => MonadEvent (EventIO t) (EventDescriptor (EventIO t) t)
+ Control.Monad.EventM: instance MonadEvent (EventIO t) e => ScheduleEvent (EventIO t) t e
+ Control.Monad.EventM: instance Typeable2 EventIO
+ Control.Monad.EventM: type HandlerAccessor t a b = EventIOHandlers t -> Ref IO (HandlerSet (EventIO t) a b)
+ Control.Monad.EventT: data EventT_RState t m
+ Control.Monad.EventT: data EventT_RWState t m
+ Control.Monad.EventT: instance (Monad m, Show t, Typeable t, Typeable1 m) => MonadEvent (EventT t m) (EventDescriptor (EventT t m) t)
+ Control.Monad.EventT: instance (Monad m, Typeable (EventT t m a)) => MonadEvent (EventT t m) (EventT t m a)
+ Control.Monad.EventT: instance (Typeable t, Typeable1 m) => Typeable1 (EventT t m)
+ Control.Monad.EventT: instance Functor m => Functor (EventT t m)
+ Control.Monad.EventT: instance Monad m => GetCurrentEvent (EventT t m) t
+ Control.Monad.EventT: instance Monad m => Monad (EventT t m)
+ Control.Monad.EventT: instance Monad m => MonadSimControl (EventT t m)
+ Control.Monad.EventT: instance Monad m => MonadTime (EventT t m) t
+ Control.Monad.EventT: instance Monad m => RetryEvent (EventT t m) t
+ Control.Monad.EventT: instance MonadCont m => MonadCont (EventT t m)
+ Control.Monad.EventT: instance MonadError e m => MonadError e (EventT t m)
+ Control.Monad.EventT: instance MonadFix m => MonadFix (EventT t m)
+ Control.Monad.EventT: instance MonadIO m => MonadIO (EventT t m)
+ Control.Monad.EventT: instance MonadPlus m => MonadPlus (EventT t m)
+ Control.Monad.EventT: instance MonadReader r m => MonadReader r (EventT t m)
+ Control.Monad.EventT: instance MonadState s m => MonadState s (EventT t m)
+ Control.Monad.EventT: instance MonadWriter w m => MonadWriter w (EventT t m)
+ Control.Monad.EventT: type HandlerAccessor t m a b = (EventTHandlers t m -> HandlerSet (EventT t m) a b, HandlerSet (EventT t m) a b -> EventTHandlers t m -> EventTHandlers t m)
- Control.Monad.Event.BasicEvents: (&-) :: (ScheduleEvent m t e2, MonadEvent m e1) => e1 -> e2 -> AdHocEvent m
+ Control.Monad.Event.BasicEvents: (&-) :: (ScheduleEvent m t e2, MonadEvent m e1, Typeable1 m) => e1 -> e2 -> AdHocEvent m
- Control.Monad.Event.BasicEvents: (?::) :: (Monad m) => m Doc -> m a -> AdHocEvent m
+ Control.Monad.Event.BasicEvents: (?::) :: Monad m => m Doc -> m a -> AdHocEvent m
- Control.Monad.Event.Classes: cancelEvent :: (CancelEvent m t) => EventID -> m (Maybe (EventDescriptor m t))
+ Control.Monad.Event.Classes: cancelEvent :: CancelEvent m t => EventID -> m (Maybe (EventDescriptor m t))
- Control.Monad.Event.Classes: class (MonadTime m t) => CancelEvent m t | m -> t
+ Control.Monad.Event.Classes: class MonadTime m t => CancelEvent m t | m -> t
- Control.Monad.Event.Classes: class (MonadTime m t) => GetCurrentEvent m t | m -> t
+ Control.Monad.Event.Classes: class MonadTime m t => GetCurrentEvent m t | m -> t
- Control.Monad.Event.Classes: class (Monad m) => MonadEvent m e | e -> m
+ Control.Monad.Event.Classes: class (Monad m, Typeable e) => MonadEvent m e | e -> m
- Control.Monad.Event.Classes: class (MonadTime m t) => MonadEventQueueInfo m t | m -> t
+ Control.Monad.Event.Classes: class MonadTime m t => MonadEventQueueInfo m t | m -> t
- Control.Monad.Event.Classes: class (Monad m) => MonadSimControl m
+ Control.Monad.Event.Classes: class Monad m => MonadSimControl m
- Control.Monad.Event.Classes: class (Monad m) => MonadTime m t | m -> t
+ Control.Monad.Event.Classes: class Monad m => MonadTime m t | m -> t
- Control.Monad.Event.Classes: class (MonadTime m t) => RetryEvent m t | m -> t
+ Control.Monad.Event.Classes: class MonadTime m t => RetryEvent m t | m -> t
- Control.Monad.Event.Classes: describeEvent :: (MonadEvent m e) => e -> m Doc
+ Control.Monad.Event.Classes: describeEvent :: MonadEvent m e => e -> m Doc
- Control.Monad.Event.Classes: doNext :: (ScheduleEvent m t e) => e -> m ()
+ Control.Monad.Event.Classes: doNext :: ScheduleEvent m t e => e -> m ()
- Control.Monad.Event.Classes: eventQueueContents :: (MonadEventQueueInfo m t) => m [EventDescriptor m t]
+ Control.Monad.Event.Classes: eventQueueContents :: MonadEventQueueInfo m t => m [EventDescriptor m t]
- Control.Monad.Event.Classes: eventQueueSize :: (MonadEventQueueInfo m t) => m Int
+ Control.Monad.Event.Classes: eventQueueSize :: MonadEventQueueInfo m t => m Int
- Control.Monad.Event.Classes: getCurrentEvent :: (GetCurrentEvent m t) => m (Maybe (EventDescriptor m t))
+ Control.Monad.Event.Classes: getCurrentEvent :: GetCurrentEvent m t => m (Maybe (EventDescriptor m t))
- Control.Monad.Event.Classes: getCurrentTime :: (MonadTime m t) => m t
+ Control.Monad.Event.Classes: getCurrentTime :: MonadTime m t => m t
- Control.Monad.Event.Classes: isSimulationRunning :: (MonadSimControl m) => m Bool
+ Control.Monad.Event.Classes: isSimulationRunning :: MonadSimControl m => m Bool
- Control.Monad.Event.Classes: pauseSimulation :: (MonadSimControl m) => m ()
+ Control.Monad.Event.Classes: pauseSimulation :: MonadSimControl m => m ()
- Control.Monad.Event.Classes: resumeSimulation :: (MonadSimControl m) => m ()
+ Control.Monad.Event.Classes: resumeSimulation :: MonadSimControl m => m ()
- Control.Monad.Event.Classes: retryEventAt :: (RetryEvent m t) => t -> m EventID
+ Control.Monad.Event.Classes: retryEventAt :: RetryEvent m t => t -> m EventID
- Control.Monad.Event.Classes: runEvent :: (MonadEvent m e) => e -> m ()
+ Control.Monad.Event.Classes: runEvent :: MonadEvent m e => e -> m ()
- Control.Monad.Event.Classes: scheduleEventAt :: (ScheduleEvent m t e) => t -> e -> m EventID
+ Control.Monad.Event.Classes: scheduleEventAt :: ScheduleEvent m t e => t -> e -> m EventID
- Control.Monad.EventM: newEventIOState :: (Ord t) => t -> IO (EventIOState t)
+ Control.Monad.EventM: newEventIOState :: Ord t => t -> IO (EventIOState t)
- Control.Monad.EventM: runEventGraph :: (MonadEvent (EventIO t) e, Ord t, Num t, Show t) => e -> IO (EventIOState t)
+ Control.Monad.EventM: runEventGraph :: (MonadEvent (EventIO t) e, Ord t, Num t, Show t, Typeable t) => e -> IO (EventIOState t)
- Control.Monad.EventM: runEventGraphWithState :: (Ord t, Show t) => EventIOState t -> IO ()
+ Control.Monad.EventM: runEventGraphWithState :: (Ord t, Show t, Typeable t) => EventIOState t -> IO ()
- Control.Monad.EventT: addHandler :: (Monad m) => HandlerAccessor t m a b -> (a -> EventT t m b) -> EventT t m HandlerID
+ Control.Monad.EventT: addHandler :: Monad m => HandlerAccessor t m a b -> (a -> EventT t m b) -> EventT t m HandlerID
- Control.Monad.EventT: removeHandler :: (Monad m) => HandlerAccessor t m a b -> HandlerID -> EventT t m (Maybe (a -> EventT t m b))
+ Control.Monad.EventT: removeHandler :: Monad m => HandlerAccessor t m a b -> HandlerID -> EventT t m (Maybe (a -> EventT t m b))
- Control.Monad.EventT: runEventGraph :: (Monad m, MonadEvent (EventT t m) e, Ord t, Num t, Show t) => e -> m (EventT_RState t m, EventT_RWState t m)
+ Control.Monad.EventT: runEventGraph :: (Monad m, MonadEvent (EventT t m) e, Ord t, Num t, Show t, Typeable t, Typeable1 m) => e -> m (EventT_RState t m, EventT_RWState t m)
- Control.Monad.EventT: runEventGraphWithState :: (Monad m, Ord t, Show t) => EventT_RState t m -> EventT_RWState t m -> m (EventT_RWState t m)
+ Control.Monad.EventT: runEventGraphWithState :: (Monad m, Ord t, Show t, Typeable t, Typeable1 m) => EventT_RState t m -> EventT_RWState t m -> m (EventT_RWState t m)
- Control.Monad.EventT: runEventT :: (Monad m) => EventT t m a -> EventT_RState t m -> EventT_RWState t m -> m (a, EventT_RWState t m)
+ Control.Monad.EventT: runEventT :: Monad m => EventT t m a -> EventT_RState t m -> EventT_RWState t m -> m (a, EventT_RWState t m)

Files

event-monad.cabal view
@@ -1,5 +1,5 @@ name:                   event-monad-version:                0.0.2.0+version:                0.0.3 stability:              experimental license:                PublicDomain 
src/Control/Monad/Event/BasicEvents.hs view
@@ -7,26 +7,35 @@         FlexibleInstances,         ExistentialQuantification,         Rank2Types,-        KindSignatures+        KindSignatures,+        DeriveDataTypeable   #-} -module Control.Monad.Event.BasicEvents where+module Control.Monad.Event.BasicEvents+    ( SimControl(..), AdHocEvent(..)+    , (?:), (?::), (&), (&-), (@:)+    ) where  import Control.Monad.Event.Classes  import Control.Monad.Trans import Text.PrettyPrint.HughesPJ import Text.PrettyPrint.HughesPJClass+import Data.Typeable  {- reified simulation control events -} data SimControl (m :: * -> *) = StopSim | StartSim         deriving (Eq, Show) +tyCon_SimControl = mkTyCon "Control.Monad.Event.BasicEvents.SimControl"+instance Typeable1 m => Typeable (SimControl m) where+    typeOf y = mkTyConApp tyCon_SimControl [typeOf1 ((undefined :: SimControl m -> m ()) y)]+ instance Pretty (SimControl m) where     pPrint StopSim  = text "Stop Simulation"     pPrint StartSim = text "Start Simulation" -instance MonadSimControl m => MonadEvent m (SimControl m) where+instance (MonadSimControl m, Typeable1 m) => MonadEvent m (SimControl m) where         describeEvent e         = return (pPrint e)         runEvent StopSim        = pauseSimulation  >> return ()         runEvent StartSim       = resumeSimulation >> return ()@@ -35,7 +44,12 @@  -- |An event with description and effect supplied at run time data AdHocEvent m = AdHocEvent (m Doc) (m ())-instance Monad m => MonadEvent m (AdHocEvent m) where++tyCon_AdHocEvent = mkTyCon "Control.Monad.Event.BasicEvents.AdHocEvent"+instance Typeable1 m => Typeable (AdHocEvent m) where+    typeOf y = mkTyConApp tyCon_AdHocEvent [typeOf1 ((undefined :: AdHocEvent m -> m ()) y)]++instance (Monad m, Typeable1 m) => MonadEvent m (AdHocEvent m) where         describeEvent (AdHocEvent doc _)        = doc         runEvent (AdHocEvent _ action)          = action @@ -81,7 +95,7 @@ -- newly installed handlers.  infixr 0 &--(&-) :: (ScheduleEvent m t e2, MonadEvent m e1) => e1 -> e2 -> AdHocEvent m+(&-) :: (ScheduleEvent m t e2, MonadEvent m e1, Typeable1 m) => e1 -> e2 -> AdHocEvent m e1 &- e2 = e1 & (describeEvent e2 ?:: doNext e2)  
src/Control/Monad/Event/Classes.hs view
@@ -10,6 +10,7 @@  import Control.Monad.Event.Internal.Types import Text.PrettyPrint.HughesPJ+import Data.Typeable  -- |A type-class for monads with a concept of time.  That concept need not -- necessarily meet any prior conditions - not even an Eq instance.@@ -26,7 +27,7 @@ -- |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.-class Monad m => MonadEvent m e | e -> m where+class (Monad m, Typeable e) => MonadEvent m e | e -> m where         describeEvent   :: e -> m Doc         describeEvent e = return (text "Undocumented event - implement describeEvent")         
src/Control/Monad/Event/Internal/Types.hs view
@@ -15,6 +15,7 @@ import Control.Monad.Event.Internal.EventID  import Text.Printf -- for the benefit of haddock+import Data.Typeable  -- | An existential wrapper containing an event which can be executed in the -- monad 'm'.@@ -25,9 +26,14 @@ -- not able to use it as a 'PrintfArg' in: --  -- > instance MonadEvent (EventT Double IO) (EventDescriptor (EventT Double IO))-data EventDescriptor (m :: * -> *) t = forall e. ScheduleEvent m t e => EventDescriptor +data EventDescriptor (m :: * -> *) t = +    forall e. ScheduleEvent m t e+    => EventDescriptor          { eventId       :: EventID         , eventTime     :: t         , event         :: e         } +tyCon_EventDescriptor = mkTyCon "Control.Monad.Event.Internal.Types.EventDescriptor"+instance Typeable1 m => Typeable1 (EventDescriptor m) where+    typeOf1 y = mkTyConApp tyCon_EventDescriptor [typeOf1 ((undefined :: EventDescriptor m t -> m ()) y)]
src/Control/Monad/EventM.hs view
@@ -9,7 +9,8 @@     FlexibleInstances,     UndecidableInstances,     TypeSynonymInstances,-    KindSignatures+    KindSignatures,+    DeriveDataTypeable   #-}  @@ -21,8 +22,10 @@     , runEventGraph     , runEventGraphWithState     +    , EventIOState     , newEventIOState     +    , HandlerAccessor     , onClockChanged     , onEventDispatch     , onEventComplete@@ -42,6 +45,7 @@ import Data.StateRef import Control.Monad.Reader import Control.Monad.Loops+import Data.Typeable  import Text.PrettyPrint.HughesPJ @@ -68,17 +72,17 @@     isSimulationRunning = EventIO (asks simRunning) >>= readReference  {- MonadEvent instance for unadorned (EventIO t) actions -}-instance MonadEvent (EventIO t) (EventIO t a) where+instance (Typeable a, Typeable t) => MonadEvent (EventIO t) (EventIO t a) where     describeEvent e = return (text "Undocumented Event")     runEvent e = e >> return () -instance MonadEvent (EventIO t) (IO a) where+instance (Typeable a, Typeable t) => MonadEvent (EventIO t) (IO a) where     describeEvent e = EventIO . lift . return $ text "Undocumented Event"     runEvent e = EventIO . lift $ (e >> return ())  {- MonadEvent instance for Event Descriptors - this does most of      the real grunt work of running an event  -}-instance Show t => MonadEvent (EventIO t) (EventDescriptor (EventIO t) t) where+instance (Typeable t, Show t) => MonadEvent (EventIO t) (EventDescriptor (EventIO t) t) where     describeEvent (EventDescriptor {eventId = eid, eventTime = t, event = e}) = do         eventDescription <- describeEvent e         return (@@ -167,7 +171,7 @@  type EventM = EventIO Double newtype EventIO t a = EventIO { unWrapEventIO :: ReaderT (EventIOState t) IO a }-    deriving (Functor, Monad, MonadIO, MonadFix)+    deriving (Functor, Monad, MonadIO, MonadFix, Typeable)  {- Running (EventIO t) actions and whole event graphs -} -- |Run an 'EventT' wrapped action.  This is a \"raw\" action - there is no @@ -179,7 +183,7 @@ -- |Repeatedly pull and run the next event in the queue until it's  -- empty or until the simulation is paused using 'pauseSimulation' -- or something equivalent.-runEventGraphWithState :: (Ord t, Show t) => EventIOState t -> IO ()+runEventGraphWithState :: (Ord t, Show t, Typeable t) => EventIOState t -> IO () runEventGraphWithState state = runEventIO (whileJust_ dequeueNextEvent runEvent) state  -- |Initialize the event queue and other stuff, run the provided \"start @@ -187,7 +191,7 @@ -- paused. runEventGraph ::     ( MonadEvent (EventIO t) e-    , Ord t, Num t, Show t+    , Ord t, Num t, Show t, Typeable t     ) => e -> IO (EventIOState t) runEventGraph e = do     state <- newEventIOState 0
src/Control/Monad/EventT.hs view
@@ -18,9 +18,11 @@     , runEventGraph     , runEventGraphWithState     +    , EventT_RState, EventT_RWState     , newEventT_RState     , newEventT_RWState     +    , HandlerAccessor     , onClockChanged     , onEventDispatch     , onEventComplete@@ -40,6 +42,8 @@ import Control.Monad.RWS import Control.Monad.Loops +import Data.Typeable+ import Text.PrettyPrint.HughesPJ  import IO@@ -79,13 +83,13 @@     isSimulationRunning = EventT (gets simRunning)  {- MonadEvent instance for unadorned (EventT t m) actions -}-instance Monad m => MonadEvent (EventT t m) (EventT t m a) where+instance (Monad m, Typeable (EventT t m a)) => MonadEvent (EventT t m) (EventT t m a) where     describeEvent e = return (text "Undocumented Event")     runEvent e = e >> return ()  {- MonadEvent instance for Event Descriptors - this does most of      the real grunt work of running an event  -}-instance (Monad m, Show t) => MonadEvent (EventT t m) (EventDescriptor (EventT t m) t) where+instance (Monad m, Show t, Typeable t, Typeable1 m) => MonadEvent (EventT t m) (EventDescriptor (EventT t m) t) where     describeEvent (EventDescriptor {eventId = eid, eventTime = t, event = e}) = do         eventDescription <- describeEvent e         return (@@ -157,6 +161,13 @@ newtype EventT t m a = EventT { unWrapEventT :: RWST (EventT_RState t m) () (EventT_RWState t m) m a }     deriving (Functor, Monad, MonadIO) +tyCon_EventT = mkTyCon "Control.Monad.EventT.EventT"+instance (Typeable t, Typeable1 m) => Typeable1 (EventT t m) where+    typeOf1 y = mkTyConApp tyCon_EventT +        [ typeOf  ((undefined :: EventT t m a -> t)    y)+        , typeOf1 ((undefined :: EventT t m a -> m ()) y)+        ]+ instance MonadTrans (EventT t) where     lift = EventT . lift @@ -242,6 +253,7 @@ -- or something equivalent. runEventGraphWithState ::      ( Monad m, Ord t, Show t+    , Typeable t, Typeable1 m     ) => EventT_RState t m -> EventT_RWState t m -> m (EventT_RWState t m) runEventGraphWithState rState rwState = do     (_, rwState) <- runEventT (whileJust_ dequeueNextEvent runEvent) rState rwState@@ -253,6 +265,7 @@ runEventGraph ::     ( Monad m, MonadEvent (EventT t m) e     , Ord t, Num t, Show t+    , Typeable t, Typeable1 m     ) => e -> m (EventT_RState t m, EventT_RWState t m) runEventGraph e = do     let rState  = newEventT_RState