1 つの Input.El を iteratee にプッシュし、残りの iteratee を返す enumeratee を書きたいと思います。ストリームに値を追加するだけでストリームを変更するため、私はこれを prepend と呼んでいます。これが私の試みです:
object Enumeratees {
def prepend[T](toPrepend: T) = new Enumeratee[T, T] {
def applyOn[A](inner: Iteratee[T, A]): Iteratee[T, Iteratee[T, A]] = {
val prepended = Iteratee.flatten(inner.feed(Input.El(toPrepend)))
Done(prepended, Input.Empty)
}
}
}
私が今それを呼び出すとき
Enumerator(1,2,3,4) |>> (Enumeratees.prepend(0) &>> Iteratee.foreach[Int]{i=>println(i)})
先頭に追加する必要がある 0 のみを出力します。列挙子からの他の値は無視されます。enumeratee (transform メソッド) の &> メソッドもオーバーライドすると、動作させることができます。
def prepend[T](toPrepend: T) = new Enumeratee[T, T] {
def applyOn[A](inner: Iteratee[T, A]): Iteratee[T, Iteratee[T, A]] = {
val prepended = Iteratee.flatten(inner.feed(Input.El(toPrepend)))
Done(prepended, Input.Empty)
}
override def transform[A](inner: Iteratee[T,A]): Iteratee[T,A] =
Iteratee.flatten(inner.feed(Input.El(toPrepend)))
}
しかし、applyOn メソッドがまだ無効であるため、これはあまりクリーンな方法ではありません。applyOn メソッドの意味を間違えたようです。私の意見では、元の iteratee を返す iteratee を返す必要があり、入力は元の iteratee で続行されます。
上記の transform メソッドは、enumeratee にどのような動作が必要かを説明する必要があります。transform の代わりに applyOn を上書きして、この動作を実現するにはどうすればよいですか?