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