module Main where
import System.Process.Corecursive
import System.Posix.Process
newtype Arg = Arg { getListOfThings :: [String] }
numberOfThings :: Arg -> Int
numberOfThings = length . getListOfThings
append :: Show a => a -> Arg -> Arg
append x (Arg xs) = Arg (show x:xs)
main :: IO ()
main = runCorecursiveApp (app parse unparse go)
where
parse :: [String] -> IO Arg
parse = pure . Arg
unparse :: Arg -> IO [String]
unparse = pure . getListOfThings
go self arg
| numberOfThings arg > 10 = print "done"
| otherwise = do
pid <- getProcessID
dat <- readCallback self (append pid arg)
putStr $ show pid ++ show (getListOfThings arg) ++ " " ++ dat