4r/app/Polysemy/Output/IO.hs

24 lines
848 B
Haskell

module Polysemy.Output.IO ( runOutputToIO
, runOutputToStdout, runOutputToStderr
, putTextO, putTextLnO
) where
import Relude
import Data.Text (unpack)
import Polysemy (Member, Sem, interpret)
import Polysemy.Embed (Embed, embed)
import Polysemy.Output (Output(Output), output)
import System.IO (hPutStr)
runOutputToIO :: Member (Embed IO) r => Handle -> Sem (Output Text ': r) () -> Sem r ()
runOutputToIO h = interpret \(Output o) -> embed $ hPutStr h $ unpack o
runOutputToStdout, runOutputToStderr :: Member (Embed IO) r => Sem (Output Text ': r) () -> Sem r ()
runOutputToStdout = runOutputToIO stdout
runOutputToStderr = runOutputToIO stderr
putTextO, putTextLnO :: Member (Output Text) r => Text -> Sem r ()
putTextO = output
putTextLnO = output . (<> "\n")