packages feed

ribosome-host-0.9.9.9: lib/Ribosome/Host/IOStack.hs

module Ribosome.Host.IOStack where

import Conc (ConcStack)
import qualified Data.Text.IO as Text
import Polysemy.Chronos (ChronosTime, interpretTimeChronos)
import System.IO (stderr)

import Ribosome.Host.Config (interpretLogConfig)
import Ribosome.Host.Data.BootError (BootError (BootError))
import Ribosome.Host.Data.HostConfig (HostConfig, LogConfig)
import Ribosome.Host.Effect.Log (FileLog, StderrLog)
import Ribosome.Host.Interpreter.Log (interpretLogStderrFile, interpretLogs)

type LogConfStack =
  [
    Log,
    StderrLog,
    FileLog,
    Reader LogConfig,
    Reader HostConfig
  ]

interpretLogConfStack ::
  Members [ChronosTime, Error BootError, Resource, Race, Async, Embed IO] r =>
  HostConfig ->
  InterpretersFor LogConfStack r
interpretLogConfStack conf =
  runReader conf .
  interpretLogConfig .
  interpretLogs .
  interpretLogStderrFile

type IOStack =
  [
    ChronosTime,
    Error BootError
  ] ++ ConcStack

errorStderr :: IO (Either BootError ()) -> IO ()
errorStderr ma =
  ma >>= \case
    Left (BootError err) -> Text.hPutStrLn stderr err
    Right () -> unit

runIOStack ::
  Sem IOStack () ->
  IO ()
runIOStack =
  errorStderr .
  runConc .
  errorToIOFinal .
  interpretTimeChronos

type BasicStack =
  LogConfStack ++ IOStack

runBasicStack ::
  HostConfig ->
  Sem BasicStack () ->
  IO ()
runBasicStack conf =
  runIOStack .
  interpretLogConfStack conf