packages feed

sarsi-0.0.5.1: sarsi-sbt/Main.hs

{-# LANGUAGE Rank2Types #-}

module Main where

import Codec.Sarsi (Event)
import Codec.Sarsi.SBT.Machine (eventProcess)
import qualified Data.List as List
import Data.Machine (ProcessT, autoM, runT_, (<~))
import qualified Data.Text.IO as TextIO
import Sarsi (getBroker, getTopic)
import qualified Sarsi as Sarsi
import Sarsi.Producer (produce)
import System.Environment (getArgs)
import System.Exit (ExitCode, exitWith)
import System.IO (BufferMode (NoBuffering), hSetBuffering, stdin, stdout)
import System.IO.Machine (byChunk)
import System.Process (StdStream (..), shell, std_in, std_out)
import System.Process.Machine (ProcessMachines, callProcessMachines)

title :: String
title = concat [Sarsi.title, "-sbt"]

-- TODO Contribute to machines-process
mStdOut_ :: ProcessT IO a b -> ProcessMachines a a0 k0 -> IO ()
mStdOut_ mp (_, Just stdOut, _) = runT_ $ mp <~ stdOut
mStdOut_ _ _ = return ()

producer :: String -> ProcessT IO Event Event -> IO (ExitCode)
producer cmd sink = do
  (ec, _) <- callProcessMachines byChunk createProc (mStdOut_ pipeline)
  return ec
  where
    pipeline = sink <~ eventProcess <~ echoText stdout
    echoText h = autoM $ (\txt -> TextIO.hPutStr h txt >> return txt)
    createProc = (shell cmd) {std_in = Inherit, std_out = CreatePipe}

main :: IO ()
main = do
  hSetBuffering stdin NoBuffering
  hSetBuffering stdout NoBuffering
  args <- getArgs
  b <- getBroker
  t <- getTopic b "."
  ec <- produce t $ producer $ concat $ List.intersperse " " ("sbt" : "-Dsbt.color=always" : args)
  exitWith ec