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 import qualified Data.ByteString.Char8 as BSC 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 onOutput (BSC.pack $ "$> " ++ cmd ++ "\n") (ec, _) <- sourceCmdWithConsumer cmd conduitRead onOutput (BSC.pack $ "ExitCode: " ++ show ec ++ "\n") return ec where conduitRead = do mBS <- await case mBS of Just bs -> do liftIO $ onOutput bs conduitRead Nothing -> return ()