module BuildBox.Command.System.Internals
( streamIn
, streamOuts)
where
import System.IO
import Control.Concurrent
import Data.ByteString.Char8 (ByteString)
import qualified Data.ByteString.Char8 as BS
streamIn :: Handle -> Chan (Maybe ByteString) -> IO ()
streamIn !hRead !chan
= do eof <- hIsEOF hRead
if eof
then do
writeChan chan Nothing
return ()
else do
str <- BS.hGetLine hRead
writeChan chan (Just str)
streamIn hRead chan
streamOuts :: [(Chan (Maybe ByteString), (Maybe Handle), QSem)] -> IO ()
streamOuts !chans
= streamOuts' False [] chans
where
streamOuts' _ [] []
= return ()
streamOuts' True prev []
= streamOuts' False [] prev
streamOuts' False prev []
= do threadDelay 100000
streamOuts' False [] prev
streamOuts' !active !prev (!x@(!chan, !mHandle, !qsem) : rest)
= isEmptyChan chan >>= \empty ->
if empty
then streamOuts' active (prev ++ [x]) rest
else do
mStr <- readChan chan
case mStr of
Nothing
-> do signalQSem qsem
streamOuts' active prev rest
Just str
| Just h <- mHandle
-> do BS.hPutStr h str
hPutChar h '\n'
streamOuts' True (prev ++ [x]) rest
| otherwise
-> streamOuts' True (prev ++ [x]) rest