{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-orphans #-}
module Control.Effect.Logger (
Logger (..),
) where
import Control.Effect.Labelled (Has, send)
import Control.Monad.Logger (
Loc,
LogLevel,
LogSource,
MonadLogger (..),
ToLogStr (..),
)
import Data.Kind (Type)
data Logger (m :: Type -> Type) k where
LoggerLog
:: ToLogStr msg
=> Loc
-> LogSource
-> LogLevel
-> msg
-> Logger m ()
instance (Has Logger sig m, Monad m) => MonadLogger m where
monadLoggerLog :: forall msg.
ToLogStr msg =>
Loc -> LogSource -> LogLevel -> msg -> m ()
monadLoggerLog Loc
loc LogSource
src LogLevel
lvl msg
msg = Logger m () -> m ()
forall (eff :: (* -> *) -> * -> *) (sig :: (* -> *) -> * -> *)
(m :: * -> *) a.
(Member eff sig, Algebra sig m) =>
eff m a -> m a
send (Loc -> LogSource -> LogLevel -> msg -> Logger m ()
forall msg (m :: * -> *).
ToLogStr msg =>
Loc -> LogSource -> LogLevel -> msg -> Logger m ()
LoggerLog Loc
loc LogSource
src LogLevel
lvl msg
msg)