通过枚举器向枚举器“追加”元素

时间:2014-02-04 22:25:56

标签: scala playframework iterate

我真的觉得我做了一些设计无法做到的事情,但我真的想完全理解Play Iteratees是如何工作的......

我目前正在撰写一个功能,通过EnumeratorEnumeratee进行一些转换。截至目前,我在进行这一特定转型方面没有任何问题。但是我想在Enumerator之前添加一些元素。我想过使用mapInputmapInputFlatten,因为我可以看到当时正在处理哪个Input。我目前解决这个问题的方法如下:

import play.api.libs.iteratee.{Enumerator, Enumeratee, Input, Iteratee}
import scala.concurrent.Await
import scala.concurrent.duration.DurationInt

def appendingEnumeratee: Enumeratee[Int, Int] = Enumeratee.mapInputFlatten {
  case Input.El(i) => Enumerator(i)
  case Input.Empty => Enumerator.enumInput(Input.Empty)
  case Input.EOF => Enumerator(42)
}

Await.result(Enumerator(1 to 41: _*).through(appendingEnumeratee).apply(Iteratee.getChunks), 5.seconds)

但是,我最终得到java.lang.RuntimeException: diverging iteratee after Input.EOF。这是在Scala 2.10.2上的play-iteratees 2.1.5

1 个答案:

答案 0 :(得分:2)

我认为代码的问题是缺少EOF。因此将其修改为以下内容将起作用:

def appendingEnumeratee: Enumeratee[Int, Int] = Enumeratee.mapInputFlatten {
    case Input.El(i) => Enumerator(i)
    case Input.Empty => Enumerator.enumInput(Input.Empty)
    case Input.EOF => Enumerator(42) andThen Enumerator.enumInput(Input.EOF)
}

或者更短一些:

def appendingEnumeratee: Enumeratee[Int, Int] = Enumeratee.mapInputFlatten {
    case Input.EOF => Enumerator(42) >>> Enumerator.enumInput(Input.EOF)
    case _else => Enumerator.enumInput(_else)
}