一昨日Pythonでも書いたので書いておく。
IterV
IterVはIterateeです。
ストリームをイテレートするものと考えて下さい。
ストリームを表すものとしてEnumeratorが定義されています。
IterV#applyによりEnumeratorをイテレートし、IterV#runで実行されます。
Enumerator#applyはコンテナとIterVをとり、コンテナをイテレートする関数が定義されます。
IterV#foldは、計算が終了した場合は結果と入力をとり、計算が途中の場合は入力から次の計算を取り出す関数をとり、何らかの値を返します。
入力にはEmpty, El, EOFがあり、それぞれデータなし、データあり、データの終わりを表します。
IterVには標準でいくつかの操作が定義されています。
IterV.head
ストリームを消費して、先頭要素をOptionで返します。
IterV.peek
先頭要素を返します。
こちらはストリームを消費しません。
IterV.length
ストリームの長さを取得します。
IterV.drop
指定した数だけストリームを消費します。
IterV.collect
指定した型に変換します。
IterV.groupBy
先頭要素と各要素をとる述語が真である限り、要素を集めます。
IterV.takeWhile
述語が真のあいだ、要素を集めます。
IterV.reversed
要素の順序を逆にしたコンテナを返します。
IterV.repeat
Iterateeを繰り返し、結果を集めます。
そして、Iterateeは合成が可能です。
scalaz.effectsパッケージではIterateeを使った入力ストリームがあります。
あまり詳しく書いていませんが、Scalaz.effectsについてを書いたので興味があったら見てください。
いまではWeb FrameworkのPlay!にも存在します。
http://playframework.github.com/api/scala/#play.api.libs.iteratee.package
今後の入出力操作の標準となるかもしれないので勉強しておいて損はないはずです。
scalaquery にもあるよ!
返信削除https://github.com/szeiger/scala-query/blob/0.9.5/src/main/scala/org/scalaquery/iter/Iteratee.scala#L9
おお、知りませんでした。
返信削除すでに乱立しているかもしれないけど、Scalaz7でみなが使わざるおえない出来になることを期待しています。