io-streams partitionEithers

时间:2017-10-10 22:47:28

标签: haskell stream

我有一个工人职能

worker :: a -> Either b c

我希望将其应用于a的流,并生成2个bc的流,并进一步处理这些流。例如,我想在c中积累Map(主要是为了折叠流)并将b输出到stderr

如何使用io-streams实现此目的?好像我不能两次打电话给connect。所以我必须在分区之前把它放到分区,因此分区将以“逆变”的方式在OutputStream上运行:

contrapartitionEithers
  :: OutputStream b -> OutputStream c -> IO (OutputStream (Either b c))

可以实施吗?如果没有,怎么办手头的任务?如果是,那么System.IO.Streams.zip会以某种方式“双重”吗?

System.IO.Streams.zip
  :: InputStream a -> InputStream b -> IO (InputStream (a, b))

1 个答案:

答案 0 :(得分:2)

有时候正确的问题包含答案。所以它确实可能:

contrapartitionEithers
  :: OutputStream b -> OutputStream c -> IO (OutputStream (Either b c))
contrapartitionEithers b c = makeOutputStream $ maybe
     (writeTo b Nothing >> writeTo c Nothing)
     (either (writeTo b . Just) (writeTo c . Just))