packages feed

axel-0.0.13: src/Axel/Eff/Log.hs

{-# LANGUAGE TemplateHaskell #-}

module Axel.Eff.Log where

import Axel.Prelude

import Axel.Eff.Console (Console, putStr)
import Axel.Eff.FileSystem (FileSystem, appendFile, writeFile)

import Effectful ((:>))
import qualified Effectful as Eff
import qualified Effectful.Dispatch.Dynamic as Eff
import qualified Effectful.TH as Eff

data Log :: Eff.Effect where
  LogStr :: Text -> Log m ()

Eff.makeEffect ''Log

runLogAsConsole ::
     (Console :> effs) => Eff.Eff (Log ': effs) a -> Eff.Eff effs a
runLogAsConsole =
  Eff.interpret $ \_ ->
    \case
      LogStr str -> putStr str

runLogAsFileSystem ::
     (FileSystem :> effs)
  => FilePath
  -> Eff.Eff (Log ': effs) a
  -> Eff.Eff effs a
runLogAsFileSystem logFilePath action = do
  writeFile logFilePath ""
  Eff.interpret
    (\_ ->
       \case
         LogStr str -> appendFile logFilePath str)
    action

ignoreLog :: Eff.Eff (Log ': effs) a -> Eff.Eff effs a
ignoreLog =
  Eff.interpret $ \_ ->
    \case
      LogStr _ -> pure ()

logStrLn :: (Log :> effs) => Text -> Eff.Eff effs ()
logStrLn str = logStr (str <> "\n")