packages feed

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")