-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Object-oriented programming realization using coroutine -- -- Object-oriented programming realization using coroutine @package coroutine-object @version 0.3.0 module Control.Monad.Trans.Crtn.Queue data Queue a Queue :: [a] -> [a] -> Queue a [fqueue] :: Queue a -> [a] [bqueue] :: Queue a -> [a] emptyQueue :: Queue a enqueue :: a -> Queue a -> Queue a dequeue :: Queue a -> (Queue a, Maybe a) instance GHC.Show.Show a => GHC.Show.Show (Control.Monad.Trans.Crtn.Queue.Queue a) -- | coroutine that can be interpreted as an object module Control.Monad.Trans.Crtn.Event -- | action order data ActionOrder e ActionOrder :: ((e -> IO ()) -> IO e) -> ActionOrder e -- | event or action type EvOrAct e = Either (ActionOrder e) e -- | definition of coroutine module Control.Monad.Trans.Crtn -- | yield command functor data Yld o x Yld :: o -> x -> Yld o x -- | Generator type is single-sided coroutine which only gives an output -- without getting any request. type GenT o = FreeT (Yld o) -- | primitive coroutine action yielding an output yield :: (Monad m) => o -> GenT o m () -- | await command functor for consumer coroutine newtype Awt a x Awt :: (a -> x) -> Awt a x -- | Consumer type is a single-sided coroutine which only gets an input -- without producing output. type CnsmT a = FreeT (Awt a) -- | primitive coroutine action awaiting an input await :: (Monad m) => CnsmT a m a -- | command functor of general bidirectional coroutine data Rqst req ans x Rqst :: req -> (ans -> x) -> Rqst req ans x -- | general symmetric bidirectional coroutine type CrtnT req ans = FreeT (Rqst req ans) -- | primitive request coroutine request :: Monad m => req -> CrtnT req ans m ans -- | Server type type SrvT req ans m = ReaderT req (CrtnT ans req m) -- | Coroutine type is regarded as a Client type which can be paired with -- Server type with opposite request and answer type. type CliT req ans = CrtnT req ans -- | type for coroutine status after execution data CrtnErr ServerFinished :: CrtnErr Other :: String -> CrtnErr -- | connecting server and client in error monad (<==|) :: Monad m => SrvT req ans m r' -> CliT req ans m r -> m (Either CrtnErr (SrvT req ans m r', r)) -- | combine state and free monad with base state monad transformer with a -- base monad m to free monad with the base monad m Think this as fusing -- down the state monad mapStateDown :: (Monad m, Functor f) => s -> FreeT f (StateT s m) a -> FreeT f m a instance GHC.Show.Show Control.Monad.Trans.Crtn.CrtnErr instance GHC.Base.Functor (Control.Monad.Trans.Crtn.Yld o) instance GHC.Base.Functor (Control.Monad.Trans.Crtn.Awt g) instance GHC.Base.Functor (Control.Monad.Trans.Crtn.Rqst req ans) -- | coroutine that can be interpreted as an object module Control.Monad.Trans.Crtn.Object -- | input of method of an object with signature s data Arg s Arg :: (s i o) -> i -> Arg s -- | output of methdo of an object with signature s data Res s Res :: (s i o) -> o -> Res s Ign :: Res s -- | Server object type SObjT s m = SrvT (Arg s) (Res s) m -- | Client object type CObjT s = CliT (Arg s) (Res s) -- | Server object base coroutine type SObjBT s m = CrtnT (Res s) (Arg s) m -- | convenient error state monad for object type EStT s m = EitherT CrtnErr (StateT s m) query :: (Monad m) => CObjT s m r -> EStT (SObjT s m ()) m r -- | describe logger module Control.Monad.Trans.Crtn.Logger class (Monad m) => MonadLog m scribe :: MonadLog m => String -> m () data LogOp i o WriteLog :: LogOp String () type LogInput = Arg LogOp type LogServer m r = SObjT LogOp m r type LogClient m r = CObjT LogOp m r writeLog :: (Monad m) => String -> LogClient m () instance (Control.Monad.Trans.Class.MonadTrans t, Control.Monad.Trans.Crtn.Logger.MonadLog m, GHC.Base.Monad (t m)) => Control.Monad.Trans.Crtn.Logger.MonadLog (t m) instance Control.Monad.Trans.Crtn.Logger.MonadLog GHC.Types.IO -- | describe world object module Control.Monad.Trans.Crtn.World data WorldOp e m i o GiveEvent :: WorldOp e m e () FlushLog :: WorldOp e m (LogServer m ()) (LogServer m ()) FlushQueue :: WorldOp e m () [Either (ActionOrder e) e] type World e m r = SObjT (WorldOp e m) m r giveEvent :: (Monad m) => e -> CObjT (WorldOp e m) m () flushLog :: (Monad m) => LogServer m () -> CObjT (WorldOp e m) m (LogServer m ()) flushQueue :: (Monad m) => CObjT (WorldOp e m) m [Either (ActionOrder e) e] -- | IO event driverzo module Control.Monad.Trans.Crtn.Driver -- | signature of IO event driver data DrvOp e i o Dispatch :: DrvOp e e (Maybe (ActionOrder e)) -- | driver type Driver e m = SObjT (DrvOp e) m -- | driver client type DrvClient e m r = CObjT (DrvOp e) m r dispatch :: (Monad m) => e -> DrvClient e m (Maybe (ActionOrder e)) -- | basic driver driver :: (Monad m, MonadLog m, MonadIO m) => LogServer (SObjBT (DrvOp e) m) () -> SObjT (WorldOp e (SObjBT (DrvOp e) m)) (SObjBT (DrvOp e) m) () -> Driver e m () -- | single event dispatch singleDispatch :: (Monad m) => Either (ActionOrder e) e -> (LogServer (SObjBT (DrvOp e) m) (), World e (SObjBT (DrvOp e) m) (), [EvOrAct e]) -> SObjBT (DrvOp e) m (LogServer (SObjBT (DrvOp e) m) (), World e (SObjBT (DrvOp e) m) (), [EvOrAct e]) -- | a single feedback step of multiple event dispatch multiDispatch :: (Monad m) => (LogServer (SObjBT (DrvOp e) m) (), World e (SObjBT (DrvOp e) m) ()) -> [EvOrAct e] -> SObjBT (DrvOp e) m (LogServer (SObjBT (DrvOp e) m) (), World e (SObjBT (DrvOp e) m) (), [EvOrAct e]) -- | full multiple event dispatch with feedback multiDispatchTillEnd :: (Monad m) => (LogServer (SObjBT (DrvOp e) m) (), World e (SObjBT (DrvOp e) m) ()) -> [EvOrAct e] -> SObjBT (DrvOp e) m (LogServer (SObjBT (DrvOp e) m) (), World e (SObjBT (DrvOp e) m) ()) -- | convenience routine for driver fire :: (Monad m, MonadLog m) => e -> EStT (Driver e m ()) m (Maybe (ActionOrder e)) -- | Common event handling module Control.Monad.Trans.Crtn.EventHandler eventHandler :: MVar (Maybe (Driver e IO ())) -> e -> IO () -- | special actor for IO action module Control.Monad.Trans.Crtn.IOActor -- | first is data IOOp e i o DoIOAction :: IOOp e ((e -> IO ()) -> IO ()) (Either String ()) type IOActor e m r = SObjT (IOOp e) m r doIOAction :: (Monad m) => ((e -> IO ()) -> IO ()) -> CObjT (IOOp e) m (Either String ()) ioactorgen :: (MonadIO m) => (e -> IO ()) -> SObjT (IOOp e) m () module Control.Monad.Trans.Crtn.Logger.Simple simplelogger :: (MonadLog m) => LogServer m () loggerW :: (MonadLog m) => Int -> LogServer m ()