假设我有两个Haskell Pipes中的Proxy
,它们代表外部系统进程。
produce :: MonadIO m => Producer ByteString m ExitCode
consume :: MonadIO m => Consumer ByteString m ExitCode
所以我将它们挂钩到一个效果
中,就像这样:
effect :: Effect m ExitCode
effect = produce >-> consume
这个
Effect
将会给我第一个终止的 Proxy
的 ExitCode
。通常这将是 produce
,而不是 consume
。那么,在 Pipes 中如何以惯用方式获取 consume
的返回值,即使它没有先终止呢?到目前为止,我认为这似乎不可能,除非进行某种令人讨厌的带内信号处理,以便
consume
知道流已经完成。最后一个 Proxy 关闭的唯一方法是通过从 await
获取某些内容,因此我可以发送一个空的 ByteString
来表示流已经完成。但这感觉不太对。现在我有一个单独的 MVar 可以提供退出值,但我认为必须有更加惯用的方法来做到这一点。