我希望看到源的不确定性交错操作,其类型签名如
interleave :: WhateverIOMonadClassItWouldWant m => [(k, Source m a)] -> Source m (k, a)
用例是我有一个 p2p 应用程序,它维护与网络上许多节点的开放连接,并且它主要只是坐在那里等待来自其中任何一个节点的消息。当消息到达时,它并不关心它来自哪里,而是需要尽快处理该消息。从理论上讲,这种应用程序(至少在用于类似套接字的源时)可以完全绕过 GHC 的 IO 管理器并运行select
/ epoll
/etc。直接调用,但我并不特别关心它是如何实现的,只要它有效。
使用导管可以实现这样的事情吗?一种不太通用但可能更可行的方法可能是编写一个[(k, Socket)] -> Source m (k, ByteString)
函数来为您处理所有套接字上的接收。
我注意到了ResumableSource
管道中的操作,但他们似乎都想知道一个特定的Sink
,这感觉有点像抽象泄漏,至少对于这个操作来说是这样。