/
TwitterPromise.scala
37 lines (28 loc) · 1.13 KB
/
TwitterPromise.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package twitter4z.http
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 >>= {
case Success(a) => f(a.value).value
case Failure(e) => promise(e.fail[TwitterResponse[B]])
}
}
}
implicit def TwitterPromiseEach = new Each[TwitterPromise] {
def each[A](m: TwitterPromise[A], f: A => Unit): Unit = m.value |>| (_ |>| (_.value |> f))
}
}