-- |Description: Pure interpreters for 'Log'.
module Polysemy.Log.Pure where

import Polysemy.Log.Effect.Log (Log (Log))
import Polysemy.Log.Data.LogMessage (LogMessage)

-- |Interpret 'Log' in terms of 'Output'.
interpretLogOutput ::
  Member (Output LogMessage) r =>
  InterpreterFor Log r
interpretLogOutput :: forall (r :: EffectRow).
Member (Output LogMessage) r =>
InterpreterFor Log r
interpretLogOutput =
  (forall (rInitial :: EffectRow) x. Log (Sem rInitial) x -> Sem r x)
-> Sem (Log : r) a -> Sem r a
forall (e :: (* -> *) -> * -> *) (r :: EffectRow) a.
FirstOrder e "interpret" =>
(forall (rInitial :: EffectRow) x. e (Sem rInitial) x -> Sem r x)
-> Sem (e : r) a -> Sem r a
interpret \case
    Log LogMessage
msg -> LogMessage -> Sem r ()
forall o (r :: EffectRow). Member (Output o) r => o -> Sem r ()
output LogMessage
msg

-- |Interpret 'Log' by discarding all messages.
interpretLogNull :: InterpreterFor Log r
interpretLogNull :: forall (r :: EffectRow). InterpreterFor Log r
interpretLogNull =
  (forall (rInitial :: EffectRow) x. Log (Sem rInitial) x -> Sem r x)
-> Sem (Log : r) a -> Sem r a
forall (e :: (* -> *) -> * -> *) (r :: EffectRow) a.
FirstOrder e "interpret" =>
(forall (rInitial :: EffectRow) x. e (Sem rInitial) x -> Sem r x)
-> Sem (e : r) a -> Sem r a
interpret \case
    Log LogMessage
_ -> () -> Sem r ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()