Я новичок как в purescript, так и в haskell (и даже в javascript и узле), поэтому я в тупике пытаюсь понять, как сэкономить выходные данные дочернего процесса в purescript. Я использую модули purescript-node-childprocess и purescript-node-fs. В принципе, проблема, которую я имею это:Как сделать вывод дочернего процесса в purescript?
import Node.ChildProcess (CHILD_PROCESS, SpawnOptions, defaultSpawnOptions, Exit(..), spawn, onExit, stdout)
import Node.Stream (onData)
type CPEffect = forall e
. Eff (cp :: CHILD_PROCESS
, console :: CONSOLE
, err :: EXCEPTION
, buffer :: BUFFER | e
) Unit
-- | Basically a wrapper around the spawn command.
-- | Takes a command, an array of arguments, and a record of
-- | options to pass to spawn.
launch :: String -> Array String -> SpawnOptions -> CPEffect
launch cmd args opts = do
cmd' <- spawn cmd args opts
onExit cmd' defaultExitHdlr
-- My problem is with onData due to its return type
onData (stdout cmd') -- what do I put as the callback handler arg?
log $ "done with " <> cmd
Как показано на мой комментарий выше, проблема заключается функция Ondata, которая исходит от модуля Node.Stream. Проблема заключается в 2-арг и тип возвращаемого:
onData :: forall w eff
. Readable w (err :: EXCEPTION | eff)
-> (Buffer -> Eff (err :: EXCEPTION | eff) Unit)
-> Eff (err :: EXCEPTION | eff) Unit
С возвращением является Eff, который возвращает блок, как я могу спасти от вывода дочернего процесса? Второй аргумент - это функция, которая принимает буфер, а также возвращает тот же тип. Действительно, именно эта функция получает данные из Readable (который является эталоном дочернего процесса). Другими словами, первым аргументом является поток stdout из узла дочернего процесса, а второй arg - обработчик обратного вызова, который будет заполнять буфер из потока stdout.
Но поскольку обработчик обратного вызова возвращает Unit, я не вижу, как я могу накапливать выходные данные дочернего процесса. Я все еще участвую в процессе обучения Monad Transformers, так это решение? Могу ли я создать монаду Writer, которая каким-то образом обертывает это?
Спасибо hdgarrood, я взгляну на пульпу, чтобы посмотреть, как это было сделано. Я изучаю большую часть своего purescript, рассматривая исходный код существующих модулей. –