{-# LANGUAGE TemplateHaskell #-}
module Colog.Polysemy.Effect
(
Log (..)
, log
, LogActionSem
, runLogActionSem
, runLogAction
, runLogAsTrace
, runLogAsOutput
, runTraceAsLog
, runOutputAsLog
) where
import Prelude hiding (log)
import Data.Kind (Type)
import Polysemy (Embed, Member, Sem, embed, interpret, makeSem_)
import Polysemy.Output (Output (..), output)
import Polysemy.Trace (Trace (..), trace)
import Colog.Core.Action (LogAction (..))
data Log (msg :: Type) (m :: Type -> Type) (a :: Type) where
Log :: msg -> Log msg m ()
makeSem_ ''Log
log :: forall msg r .
Member (Log msg) r
=> msg
-> Sem r ()
type LogActionSem r msg = LogAction (Sem r) msg
runLogActionSem :: forall msg r a . LogActionSem r msg -> Sem (Log msg ': r) a -> Sem r a
runLogActionSem :: LogActionSem r msg -> Sem (Log msg : r) a -> Sem r a
runLogActionSem (LogAction action :: msg -> Sem r ()
action) = (forall x (m :: * -> *). Log msg m x -> Sem r x)
-> Sem (Log msg : r) a -> Sem r a
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
FirstOrder e "interpret" =>
(forall x (m :: * -> *). e m x -> Sem r x)
-> Sem (e : r) a -> Sem r a
interpret ((forall x (m :: * -> *). Log msg m x -> Sem r x)
-> Sem (Log msg : r) a -> Sem r a)
-> (forall x (m :: * -> *). Log msg m x -> Sem r x)
-> Sem (Log msg : r) a
-> Sem r a
forall a b. (a -> b) -> a -> b
$ \case
Log msg -> msg -> Sem r ()
action msg
msg
runLogAction
:: forall m msg r a .
Member (Embed m) r
=> LogAction m msg
-> Sem (Log msg ': r) a
-> Sem r a
runLogAction :: LogAction m msg -> Sem (Log msg : r) a -> Sem r a
runLogAction (LogAction action :: msg -> m ()
action) = (forall x (m :: * -> *). Log msg m x -> Sem r x)
-> Sem (Log msg : r) a -> Sem r a
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
FirstOrder e "interpret" =>
(forall x (m :: * -> *). e m x -> Sem r x)
-> Sem (e : r) a -> Sem r a
interpret ((forall x (m :: * -> *). Log msg m x -> Sem r x)
-> Sem (Log msg : r) a -> Sem r a)
-> (forall x (m :: * -> *). Log msg m x -> Sem r x)
-> Sem (Log msg : r) a
-> Sem r a
forall a b. (a -> b) -> a -> b
$ \case
Log msg -> m () -> Sem r x
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
embed (m () -> Sem r x) -> m () -> Sem r x
forall a b. (a -> b) -> a -> b
$ msg -> m ()
action msg
msg
{-# INLINE runLogAction #-}
runLogAsTrace
:: forall r a .
Member Trace r
=> Sem (Log String ': r) a
-> Sem r a
runLogAsTrace :: Sem (Log String : r) a -> Sem r a
runLogAsTrace = (forall x (m :: * -> *). Log String m x -> Sem r x)
-> Sem (Log String : r) a -> Sem r a
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
FirstOrder e "interpret" =>
(forall x (m :: * -> *). e m x -> Sem r x)
-> Sem (e : r) a -> Sem r a
interpret ((forall x (m :: * -> *). Log String m x -> Sem r x)
-> Sem (Log String : r) a -> Sem r a)
-> (forall x (m :: * -> *). Log String m x -> Sem r x)
-> Sem (Log String : r) a
-> Sem r a
forall a b. (a -> b) -> a -> b
$ \case
Log msg -> String -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
MemberWithError Trace r =>
String -> Sem r ()
trace String
msg
{-# INLINE runLogAsTrace #-}
runLogAsOutput
:: forall msg r a .
Member (Output msg) r
=> Sem (Log msg ': r) a
-> Sem r a
runLogAsOutput :: Sem (Log msg : r) a -> Sem r a
runLogAsOutput = (forall x (m :: * -> *). Log msg m x -> Sem r x)
-> Sem (Log msg : r) a -> Sem r a
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
FirstOrder e "interpret" =>
(forall x (m :: * -> *). e m x -> Sem r x)
-> Sem (e : r) a -> Sem r a
interpret ((forall x (m :: * -> *). Log msg m x -> Sem r x)
-> Sem (Log msg : r) a -> Sem r a)
-> (forall x (m :: * -> *). Log msg m x -> Sem r x)
-> Sem (Log msg : r) a
-> Sem r a
forall a b. (a -> b) -> a -> b
$ \case
Log msg -> msg -> Sem r ()
forall o (r :: [(* -> *) -> * -> *]).
MemberWithError (Output o) r =>
o -> Sem r ()
output msg
msg
{-# INLINE runLogAsOutput #-}
runTraceAsLog
:: forall r a .
Member (Log String) r
=> Sem (Trace ': r) a
-> Sem r a
runTraceAsLog :: Sem (Trace : r) a -> Sem r a
runTraceAsLog = (forall x (m :: * -> *). Trace m x -> Sem r x)
-> Sem (Trace : r) a -> Sem r a
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
FirstOrder e "interpret" =>
(forall x (m :: * -> *). e m x -> Sem r x)
-> Sem (e : r) a -> Sem r a
interpret ((forall x (m :: * -> *). Trace m x -> Sem r x)
-> Sem (Trace : r) a -> Sem r a)
-> (forall x (m :: * -> *). Trace m x -> Sem r x)
-> Sem (Trace : r) a
-> Sem r a
forall a b. (a -> b) -> a -> b
$ \case
Trace msg -> String -> Sem r ()
forall msg (r :: [(* -> *) -> * -> *]).
Member (Log msg) r =>
msg -> Sem r ()
log String
msg
{-# INLINE runTraceAsLog #-}
runOutputAsLog
:: forall msg r a .
Member (Log msg) r
=> Sem (Output msg ': r) a
-> Sem r a
runOutputAsLog :: Sem (Output msg : r) a -> Sem r a
runOutputAsLog = (forall x (m :: * -> *). Output msg m x -> Sem r x)
-> Sem (Output msg : r) a -> Sem r a
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
FirstOrder e "interpret" =>
(forall x (m :: * -> *). e m x -> Sem r x)
-> Sem (e : r) a -> Sem r a
interpret ((forall x (m :: * -> *). Output msg m x -> Sem r x)
-> Sem (Output msg : r) a -> Sem r a)
-> (forall x (m :: * -> *). Output msg m x -> Sem r x)
-> Sem (Output msg : r) a
-> Sem r a
forall a b. (a -> b) -> a -> b
$ \case
Output msg -> msg -> Sem r ()
forall msg (r :: [(* -> *) -> * -> *]).
Member (Log msg) r =>
msg -> Sem r ()
log msg
msg
{-# INLINE runOutputAsLog #-}