packages feed

heftia-effects-0.5.0.0: src/Control/Monad/Hefty/Log.hs

-- SPDX-License-Identifier: MPL-2.0

{- |
Copyright   :  (c) 2024 Sayo Koyoneda
License     :  MPL-2.0 (see the LICENSE file)
Maintainer  :  ymdfield@outlook.jp

Interpreters for the [@co-log@](https://hackage.haskell.org/package/co-log) ecosystem.

The interface is similar to [@co-log-polysemy@](https://hackage.haskell.org/package/co-log-polysemy).
-}
module Control.Monad.Hefty.Log (
    module Control.Monad.Hefty.Log,
    module Data.Effect.Log,
)
where

import Colog.Core (LogAction (LogAction))
import Control.Monad.Hefty (Eff, interpret, send, type (<|), type (~>))
import Control.Monad.Hefty.Output (Output (..), output)
import Data.Effect.Log
import Prelude hiding (log)

runLogAsOutput :: (Output msg <| ef) => Eff eh (Log msg ': ef) ~> Eff eh ef
runLogAsOutput = interpret \(Log msg) -> output msg

runOutputAsLog :: (Log msg <| ef) => Eff eh (Output msg ': ef) ~> Eff eh ef
runOutputAsLog = interpret \(Output msg) -> log msg

runLogAction :: LogAction (Eff eh ef) msg -> Eff eh (Log msg ': ef) ~> Eff eh ef
runLogAction (LogAction f) = interpret \(Log msg) -> f msg

runLogActionEmbed :: (m <| ef) => LogAction m msg -> Eff eh (Log msg ': ef) ~> Eff eh ef
runLogActionEmbed (LogAction f) = interpret \(Log msg) -> send $ f msg