packages feed

fused-effects-logger-0.0.1.1: src/Control/Effect/Logger.hs

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-orphans #-}

-- | A simple logger effect that takes all the information a 'MonadLogger' monad
-- would take. Use the logging functions of 'MonadLogger' to log things the way
-- you want, as there are many options there (TH or non-TH).
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
  -- | See 'monadLoggerLog'.
  LoggerLog
    :: ToLogStr msg
    => Loc
    -> LogSource
    -> LogLevel
    -> msg
    -> Logger m ()

-- | Unfortunately, we need to implement the 'MonadLogger' instance as an orphan
-- in order to be able to use the same interface as 'MonadLogger'.
instance (Has Logger sig m, Monad m) => MonadLogger m where
  monadLoggerLog loc src lvl msg = send (LoggerLog loc src lvl msg)