{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
module Process where
import qualified Data.ByteString.Lazy as BSL
import Polysemy
import Polysemy.Input
import System.Exit (ExitCode (..))
import qualified System.Process.Typed as TP
data Process m a where
Read_ :: TP.ProcessConfig stdin stdout stderr -> Process m (BSL.ByteString, BSL.ByteString)
ReadInterleaved_ :: TP.ProcessConfig stdin stdout stderr -> Process m BSL.ByteString
ReadInterleaved :: TP.ProcessConfig stdin stdout stderr -> Process m (ExitCode, BSL.ByteString)
makeSem ''Process
runIO ::
Member (Embed IO) r =>
Sem (Process ': r) a ->
Sem r a
runIO =
interpret $ \case
Read_ config -> embed $ (TP.readProcess_ config)
ReadInterleaved_ config -> embed $ (TP.readProcessInterleaved_ config)
ReadInterleaved config -> embed $ (TP.readProcessInterleaved config)
runPure ::
[BSL.ByteString] ->
Sem (Process ': r) a ->
Sem r a
runPure outputList =
runInputList outputList
. reinterpret \case
Read_ _config -> do
r <- maybe "" id <$> input
return (r, "")
ReadInterleaved_ _config -> maybe "" id <$> input
ReadInterleaved _config -> do
r <- maybe "" id <$> input
return (ExitSuccess, r)