From bd7145da56629debca05c1b2de8c8e0fb90d4d9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=AD=E3=81=93=E3=81=AF=E3=82=8B?= Date: Mon, 26 Dec 2011 21:58:43 +0900 Subject: [PATCH] add TwitterPromiseFunctor --- .../main/scala/twitter4z/exception/package.scala | 4 +++- core/src/main/scala/twitter4z/http/Http.scala | 5 ++++- .../main/scala/twitter4z/http/TwitterPromise.scala | 13 ++++++++++++- tetris/src/main/scala/twitter4z/tetris/Tetris.scala | 5 +---- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/core/src/main/scala/twitter4z/exception/package.scala b/core/src/main/scala/twitter4z/exception/package.scala index 997eec2..c3080e1 100644 --- a/core/src/main/scala/twitter4z/exception/package.scala +++ b/core/src/main/scala/twitter4z/exception/package.scala @@ -5,6 +5,8 @@ import Scalaz._ package object exception { - type TwitterResult[A] = ValidationNEL[TwitterException, A] + type TwitterExceptions = NonEmptyList[TwitterException] + + type TwitterResult[A] = Validation[TwitterExceptions, A] } diff --git a/core/src/main/scala/twitter4z/http/Http.scala b/core/src/main/scala/twitter4z/http/Http.scala index 1b4bdd0..55b919d 100644 --- a/core/src/main/scala/twitter4z/http/Http.scala +++ b/core/src/main/scala/twitter4z/http/Http.scala @@ -1,9 +1,12 @@ package twitter4z.http import java.io._ + +import scalaj.http.{ Http => ScalajHttp, _ } + import scalaz._ import Scalaz._ -import scalaj.http.{ Http => ScalajHttp, _ } +import scalaz.concurrent._ trait Http { diff --git a/core/src/main/scala/twitter4z/http/TwitterPromise.scala b/core/src/main/scala/twitter4z/http/TwitterPromise.scala index 718a1e9..08b7994 100644 --- a/core/src/main/scala/twitter4z/http/TwitterPromise.scala +++ b/core/src/main/scala/twitter4z/http/TwitterPromise.scala @@ -4,15 +4,26 @@ import scalaz._ import Scalaz._ import scalaz.concurrent._ +import twitter4z.exception.TwitterExceptions + case class TwitterPromise[A](value: Promise[TwitterAPIResult[A]]) extends NewType[Promise[TwitterAPIResult[A]]] object TwitterPromise { def apply[A](result: TwitterAPIResult[A]): TwitterPromise[A] = TwitterPromise(promise(result)) + implicit def TwitterPromiseFunctor = new Functor[TwitterPromise] { + def fmap[A, B](m: TwitterPromise[A], f: A => B): TwitterPromise[B] = TwitterPromise { + m.value.map { + case Success(a) => a.copy(value=f(a.value).value).success[TwitterExceptions] + case Failure(e) => e.fail[TwitterResponse[B]] + } + } + } + implicit def TwitterPromiseBind = new Bind[TwitterPromise] { def bind[A, B](m: TwitterPromise[A], f: A => TwitterPromise[B]): TwitterPromise[B] = TwitterPromise { - m.value.flatMap { + m.value >>= { case Success(a) => f(a.value).value case Failure(e) => promise(e.fail[TwitterResponse[B]]) } diff --git a/tetris/src/main/scala/twitter4z/tetris/Tetris.scala b/tetris/src/main/scala/twitter4z/tetris/Tetris.scala index eed84d5..7d26a49 100644 --- a/tetris/src/main/scala/twitter4z/tetris/Tetris.scala +++ b/tetris/src/main/scala/twitter4z/tetris/Tetris.scala @@ -70,10 +70,7 @@ object Tetris extends SimpleSwingApplication { } for { statuses <- publicTimeline() - icons <- statuses.map(_.user.profile.imageURL).parMap(ImageIO.read(_)) - } yield { - statuses.value.map(_.user.profile.imageURL).parMap(ImageIO.read) - } + } yield statuses.map(_.user.profile.imageURL).map(ImageIO.read(_)) } }