次のような型シグネチャを使用して、ソースの非決定論的なインターリーブ操作を見たいと思っていました
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