不确定交错管道的来源

cop*_*kin 5 haskell conduit

我希望看到源的非确定性交错操作,类型签名如

interleave :: WhateverIOMonadClassItWouldWant m => [(k, Source m a)] -> Source m (k, a)
Run Code Online (Sandbox Code Playgroud)

用例是我有一个p2p应用程序,它保持与网络上许多节点的开放连接,而且它主要是坐在等待来自其中任何节点的消息.当消息到达时,它不关心它来自何处,但需要尽快处理消息.理论上,这种应用程序(至少用于类似套接字的源)可以完全绕过GHC的IO管理器并运行select/ epoll/ etc.直接打电话,但我并不特别在意它是如何实现的,只要它有效.

管道可以这样吗?一种不那么通用但可能更可行的方法可能是编写一个[(k, Socket)] -> Source m (k, ByteString)处理所有套接字接收的函数.

我注意到ResumableSource管道中的操作,但它们似乎都想要了解一个特定的Sink,这感觉就像一个抽象泄漏,至少对于这个操作.

Mic*_*man 5

stm-conduit包提供mergeSources,它执行与您正在寻找的类似的东西 - 尽管不完全相同.这可能是一个很好的起点.