2012年3月31日土曜日

play.api.libs.iteratee

明日はPlay Framework 2.0 ソースコードリーディングの会でIterateeのところを任されたのでちょっと使ってみたり。

Iteratee

適当な説明

  • Enumerator -> ストリーム
  • Iteratee -> ストリームに対する処理
  • Enumeratee -> ストリームの各要素に対する処理
以上!



Enumerator(1, 2, 3) &> Enumeratee.map(2 *) |>> Iteratee.fold(0)(_ + _)
List(1, 2, 3).map(2 *).fold(0)(_ + _)
view raw enumlist.scala hosted with ❤ by GitHub

scalaz.iterateeとの比較

Scalazのと比較すると簡単に思える不思議。

Scalaz
  • Scalazではモナド変換子版がベース。
  • IterateeにEnumeratee,Enumeratorを適用する。
  • 型クラスを利用した実装で提供される関数は多い。
  • だが型にうるさい。
  • 明示的に型を指定しなければいけないこともしばしば。

Play
  • Playでは結果がPromiseで返る。
  • EnumeratorにIteratee,Enumerateeを適用する。
  • 内部で使うことが目的なので提供される関数は少ない。
  • まあfoldあれば事足りるよね。
  • 推論が効く!Scalazのより楽だ!

結論:Scalazの方が高機能、Playの方はシンプル

ページ内文字列カウントスクリプト

ワンライナー!

import java.net.URL
import play.api.mvc.Codec
import play.api.libs.iteratee._
object Main extends App {
Enumerator.fromStream(new URL(args(0)).openStream) &>
Parsing.search(implicitly[Codec].encode(args(1))) &>
Enumeratee.collect { case Parsing.Matched(_) => 1 } |>>
Iteratee.fold(0)(_ + _) map (_ mapDone println) flatMap (_.run) await
}

処理を適用していく感じが関数型言語チックでとても書きやすいです。

0 件のコメント:

コメントを投稿