我正在尝试Conduit使用attoparsec解析器编写一个。具体来说,给定parseOne :: Parser T,我想构造一个Conduit ByteString m T重复地将解析器应用于输入并流式传输结果的方法。
attoparsec-conduit提议sinkParser将 aParser变成 a Sink,但我怎样才能将其Sink变成 a Conduit?我正在寻找的是一个类似的功能:
conduitSink :: (Resource m) => Sink a m b -> Conduit a m b
它反复将数据输入到 中Sink,同时产生每个结果。看起来它可以很容易地编写为手动循环,但我想知道是否有更好的方法。
管道库中缺少这个看似显而易见的功能让我觉得我可能做错了什么;有没有更好的方法来做到这一点?用例是将原始字节转换为基于消息的网络协议的解析形式,以供管道的后续阶段处理。Conduit T m ByteString多亏了blaze-builder-conduit ,我已经有了相反的方向(即) ,所以这似乎是构建事物的最自然的方式。