我正在尝试创建一个可以使用多个输入流的管道。我需要能够以无特定顺序(例如,不交替)等待一个或另一个输入流,从而使 zip 无用。这里没有任何并行或不确定的事情发生:我在一个流或另一个流上等待。我希望能够编写类似于以下的代码(分别在第一个或第二个输入流上的 whereawaitA
和awaitB
await ):
do
_ <- awaitA
x <- awaitA
y <- awaitB
yield (x,y)
_ <- awaitB
_ <- awaitB
y' <- awaitB
yield (x,y')
我最好的解决方案是让内部单子成为另一个管道,例如
foo :: Sink i1 (ConduitM i2 o m) ()
然后允许
awaitA = await
awaitB = lift await
这主要是有效的。不幸的是,这似乎使得在外导管完全连接之前很难熔合到内导管。我尝试的第一件事是:
fuseInner :: Monad m =>
Conduit i2' m i2 ->
Sink i1 (ConduitM i2 o m) () ->
Sink i1 (ConduitM i2' o m) ()
fuseInner x = transPipe (x =$=)
但这不起作用,至少在x
有状态的情况下,因为(x =$=)
多次运行,x
每次都有效地重新启动。
有没有办法写 fuseInner,而不是闯入导管的内部(看起来会很乱)?有没有更好的方法来处理多个输入流?我只是远远超出了管道的设计目的吗?
谢谢!