Я пытаюсь написать Conduit
, используя синтаксический анализатор attoparsec. В частности, учитывая parseOne :: Parser T
, я хотел бы создать Conduit ByteString m T
, который многократно применяет синтаксический анализатор к входным данным и передает результаты.
attoparsec-conduit предлагает sinkParser
превратить Parser
в Sink
, но как я могу превратить это Sink
в Conduit
? То, что я ищу, это функция вроде:
conduitSink :: (Resource m) => Sink a m b -> Conduit a m b
который многократно передает данные в Sink
, производя каждый результат по мере его поступления. Кажется, что это можно было бы довольно легко написать как ручной цикл, но мне интересно, есть ли лучший способ.
Отсутствие этой, казалось бы, очевидной функции в библиотеке каналов заставляет меня думать, что я делаю что-то не так; есть ли лучший способ сделать это? Вариант использования — преобразование необработанных байтов в проанализированную форму сетевого протокола на основе сообщений для обработки на более поздних этапах конвейера. У меня уже есть противоположное направление (то есть Conduit T m ByteString
) благодаря blaze-builder-conduit , так что это казалось наиболее естественным способом структурировать вещи.