module System.Process.Text where
import Control.Concurrent
import Control.Monad
import Data.Text (Text)
import qualified Data.Text as T
import qualified Data.Text.IO as T
import System.Process
import System.Exit (ExitCode)
import System.IO
readProcessWithExitCode
:: FilePath
-> [String]
-> Text
-> IO (ExitCode, Text, Text)
readProcessWithExitCode cmd args input = do
(Just inh, Just outh, Just errh, pid) <-
createProcess (proc cmd args){ std_in = CreatePipe,
std_out = CreatePipe,
std_err = CreatePipe }
outMVar <- newEmptyMVar
outM <- newEmptyMVar
errM <- newEmptyMVar
_ <- forkIO $ do
out <- T.hGetContents outh
putMVar outM out
putMVar outMVar ()
_ <- forkIO $ do
err <- T.hGetContents errh
putMVar errM err
putMVar outMVar ()
when (not (T.null input)) $ do T.hPutStr inh input; hFlush inh
hClose inh
takeMVar outMVar
takeMVar outMVar
hClose outh
ex <- waitForProcess pid
out <- readMVar outM
err <- readMVar errM
return (ex, out, err)