проводник: возможен источник только для чтения?

Предположим, что у меня есть источник keypads :: Producer IO Keypad, который создает поток конфиденциальных данных, таких как одноразовые клавиатуры.

Теперь, если моя библиотека предоставляет keypads, конечный пользователь может подключить keypads к двум приемникам, назовем их good и bad, где bad запрашивает значение и читает его, но затем возвращает его обратно вверх по течению через leftover. Позже приемник good может использовать ту же клавиатуру, которую ранее считывал bad. Конечный пользователь может этого не заметить, например, если good и bad предоставляются внешними библиотеками.

Есть ли способ создать в канале источник только для чтения, который отбрасывает оставшиеся данные?

(Я прочитал здесь, что невозможно отключить повторное использование остатков, но поскольку я новичок в каналах, может быть, есть другой способ проектирования архитектуры, которого я не вижу.)


person somebody    schedule 02.09.2014    source источник


Ответы (1)


Я могу думать о двух вариантах:

  1. Оберните bad map id Conduit, чтобы предотвратить размножение остатков. Я думаю, что ваш код будет выглядеть примерно так:

    keypads $$ (CL.map id =$= bad) >> good
    
  2. Спуститесь на уровень абстракции Pipe и вызовите injectLeftovers на bad, чтобы убедиться, что все остатки потребляются там, а затем отбрасываются.

Я предполагаю, что (1) - это подход, который вам нужен.

person Michael Snoyman    schedule 02.09.2014