2

設計上不可能なことをやっているような気がしますが、Play Iteratees がどのように機能するかを完全に理解したいと思っています...

Enumerator現在、を介してに何らかの変換を適用する関数を作成していますEnumeratee。今のところ、この特定の変換を行うのに問題はありません。しかし、私はいくつかの要素をEnumerator. その時点でどちらが処理されているかがわかるので、mapInputまたはを使用することを考えました。この問題に対する私の現在の解決策は次のようになります。mapInputFlattenInput

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ます。これは、play-iteratees 2.1.5 を使用した Scala 2.10.2 にあります。

4

1 に答える 1

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)
}
于 2014-02-05T07:45:29.460 に答える