module Cook.Util where

import Data.Conduit
import Data.Conduit.Process
import Control.Monad.Trans
import System.Exit
import System.IO (hPutStrLn, stderr)

import qualified Data.ByteString as BS

logInfo :: MonadIO m => String -> m ()
logInfo = liftIO . hPutStrLn stderr

logDebug :: MonadIO m => String -> m ()
logDebug _ = return ()

systemStream :: String -> (BS.ByteString -> IO ()) -> IO ExitCode
systemStream cmd onOutput =
    do (ec, _) <- sourceCmdWithConsumer cmd conduitRead
       return ec
    where
      conduitRead =
          do mBS <- await
             case mBS of
               Just bs ->
                   do liftIO $ onOutput bs
                      conduitRead
               Nothing ->
                   return ()