Scalaz迭代器,为BufferedReader创建枚举器
如何为BufferedReader创建枚举器 我发现了一篇相当旧的文章:它似乎不适用于Scalaz6.0.4 我尝试根据以下示例创建枚举器:Scalaz迭代器,为BufferedReader创建枚举器,scala,scalaz,Scala,Scalaz,如何为BufferedReader创建枚举器 我发现了一篇相当旧的文章:它似乎不适用于Scalaz6.0.4 我尝试根据以下示例创建枚举器: 但我不明白如何将IO monad与Enumerator结合起来鲁纳尔的文章怎么了?以下版本适用于我(Scalaz 6.0.4): objectfileiteratee{ def enumReader[A](r:BufferedReader,it:IterV[String,A]):IO[IterV[String,A]={ def循环:IterV[String
但我不明白如何将IO monad与Enumerator结合起来鲁纳尔的文章怎么了?以下版本适用于我(Scalaz 6.0.4):
objectfileiteratee{
def enumReader[A](r:BufferedReader,it:IterV[String,A]):IO[IterV[String,A]={
def循环:IterV[String,A]=>IO[IterV[String,A]={
案例i@Done(u,u)=>i.pure[IO]
案例i@Cont(k) =>用于{
IO[C]:IO[C]=
为了{
a谢谢,它很管用!但据我所知,scalaz的进化,从6版开始,更方便的方法是提供枚举器
implicit val ListEnumerator = new Enumerator[List] {
def apply[E, A](e: List[E], i: IterV[E, A]): IterV[E, A] = e match {
case List() => i
case x :: xs => i.fold(done = (_, _) => i,
cont = k => apply(xs, k(El(x))))
}
}
object FileIteratee {
def enumReader[A](r: BufferedReader, it: IterV[String, A]) : IO[IterV[String, A]] = {
def loop: IterV[String, A] => IO[IterV[String, A]] = {
case i@Done(_, _) => i.pure[IO]
case i@Cont(k) => for {
s <- r.readLine.pure[IO]
a <- if (s == null) i.pure[IO] else loop(k(El(s)))
} yield a
}
loop(it)
}
def bufferFile(f: File) = new BufferedReader(new FileReader(f)).pure[IO]
def closeReader(r: Reader) = r.close().pure[IO]
def bracket[A,B,C](init: IO[A], fin: A => IO[B], body: A => IO[C]): IO[C] =
for {
a <- init
c <- body(a)
_ <- fin(a)
} yield c
def enumFile[A](f: File, i: IterV[String, A]) : IO[IterV[String, A]] =
bracket(bufferFile(f),
closeReader(_: BufferedReader),
enumReader(_: BufferedReader, i))
}