Источники канала с недетерминированным чередованием

Я надеялся увидеть недетерминированную операцию чередования для источников,с сигнатурой типа

interleave :: WhateverIOMonadClassItWouldWant m => [(k, Source m a)] -> Source m (k, a)

Вариант использования заключается в том, что у меня есть приложение p2p, которое поддерживает открытые соединения со многими узлами в сети, и в основном оно просто сидит и ждет сообщений от любого из них. Когда приходит сообщение, ему все равно, откуда оно пришло, но нужно обработать сообщение как можно скорее. Теоретически такого рода приложения (, по крайней мере, при использовании для сокетов -, таких как источники ), могут полностью обойти диспетчер ввода-вывода GHC и запускать select/ epoll/etc. вызывает напрямую, но мне все равно, как это реализовано, лишь бы оно работало.

Возможно ли что-то подобное с проводником? Менее общий, но, вероятно, более осуществимый подход может состоять в том, чтобы написать функцию [(k, Socket)] -> Source m (k, ByteString), которая обрабатывает получение для вас на всех сокетах.

Я заметил операции ResumableSourceв conduit, но все они, кажется, хотят знать о конкретном Sink, что похоже на некоторую утечку абстракции, по крайней мере, для этой операции.

5
задан copumpkin 14 July 2012 в 06:58
поделиться