是否有一个实例Stream Handle IO Char for Text.Parsec.Stream?

时间:2012-12-06 23:22:38

标签: haskell handle parsec

我正在解析一个相当大的文件,我想定期更新一个进度条,以表明到目前为止我已经解析了多少。

我能想到的最直接的方法是使用ParsecT作为IO的monad转换器,这样我就可以解除打印进度条更新,并使用Handle作为流提供商,以便我可以使用hFileSizehTell检查进度。

这意味着我需要一个实例Stream Handle IO Char。滚动我自己应该不难(使用hGetChar),但我想我已经看到是否已存在,以处理任何不可预见的问题(比如我是否需要为速度插入一些缓冲)。

1 个答案:

答案 0 :(得分:2)

一个hack就是提前检查文件的大小。然后,在解析时,检查parsec可用的SourcePos以查看您已经获得了多远。这样做的缺点是,如果要跟踪实际字节数(以便您可以使用文件系统的文件大小知识来避免遍历文件两次),则必须使用{{3}手动重新实现基本解析器}。但是,解析器组合器不需要重新实现。

或者,您可以遍历文件两次并使用行计数(在第一次遍历期间计算)作为对您已经达到的距离的估计。