axel-0.0.11: src/Axel/Eff/Log.hs
{-# LANGUAGE GADTs #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
module Axel.Eff.Log where
import Axel.Prelude
import Axel.Eff.Console (Console, putStr)
import Axel.Eff.FileSystem (FileSystem, appendFile, writeFile)
import qualified Polysemy as Sem
data Log m a where
LogStr :: Text -> Log m ()
Sem.makeSem ''Log
runLogAsConsole ::
(Sem.Member Console effs) => Sem.Sem (Log ': effs) a -> Sem.Sem effs a
runLogAsConsole =
Sem.interpret $ \case
LogStr str -> putStr str
runLogAsFileSystem ::
(Sem.Member FileSystem effs)
=> FilePath
-> Sem.Sem (Log ': effs) a
-> Sem.Sem effs a
runLogAsFileSystem logFilePath action = do
writeFile logFilePath ""
Sem.interpret
(\case
LogStr str -> appendFile logFilePath str)
action
ignoreLog :: Sem.Sem (Log ': effs) a -> Sem.Sem effs a
ignoreLog =
Sem.interpret $ \case
LogStr _ -> pure ()
logStrLn :: (Sem.Member Log effs) => Text -> Sem.Sem effs ()
logStrLn str = logStr (str <> "\n")