10 | module Log4Types.HasLog
12 | import public Control.Monad.Reader.Interface
13 | import Control.Monad.Reader.Reader
14 | import public Control.Monad.Trans
15 | import Log4Types.Core
29 | interface HasLog env msg (0 m : Type -> Type) where
31 | getLogAction : env -> LogAction m msg
33 | setLogAction : LogAction m msg -> env -> env
37 | HasLog (LogAction m msg) msg m where
39 | setLogAction = const
47 | logMsg : Monad m => MonadReader env m => HasLog env msg m => msg -> m ()
50 | unLogAction (getLogAction env) msg
54 | withLog : Monad m => MonadReader env m => HasLog env msg m
55 | => (LogAction m msg -> LogAction m msg)
57 | withLog f = local (\env => setLogAction (f (getLogAction env)) env)
71 | record LoggerT (msg : Type) (m : Type -> Type) (a : Type) where
72 | constructor MkLoggerT
73 | unLoggerT : ReaderT (LogAction (LoggerT msg m) msg) m a
76 | Functor m => Functor (LoggerT msg m) where
77 | map f (MkLoggerT r) = MkLoggerT (map f r)
80 | Applicative m => Applicative (LoggerT msg m) where
81 | pure x = MkLoggerT (pure x)
82 | MkLoggerT f <*> MkLoggerT x = MkLoggerT (f <*> x)
85 | Monad m => Monad (LoggerT msg m) where
86 | MkLoggerT m >>= f = MkLoggerT (m >>= unLoggerT . f)
89 | MonadTrans (LoggerT msg) where
90 | lift = MkLoggerT . lift
93 | HasIO m => HasIO (LoggerT msg m) where
94 | liftIO = MkLoggerT . liftIO
97 | Monad m => MonadReader (LogAction (LoggerT msg m) msg) (LoggerT msg m) where
99 | local f (MkLoggerT m) = MkLoggerT (local f m)
106 | usingLoggerT : Monad m => LogAction m msg -> LoggerT msg m a -> m a
107 | usingLoggerT act (MkLoggerT r) =
108 | runReaderT (hoistLogAction lift act) r