-
Notifications
You must be signed in to change notification settings - Fork 29
/
Await.scala
36 lines (28 loc) · 1.34 KB
/
Await.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
package com.thoughtworks.dsl.keywords
import com.thoughtworks.dsl.Dsl
import com.thoughtworks.dsl.Dsl.Keyword
import scala.concurrent.{ExecutionContext, Future}
import scala.language.implicitConversions
import scala.util.{Failure, Success}
import scala.concurrent.Await.result
import scala.concurrent.duration.Duration
final case class Await[Value](future: Future[Value]) extends AnyVal with Keyword[Await[Value], Value]
object Await {
implicit def implicitAwait[Value](future: Future[Value]): Await[Value] = Await[Value](future)
implicit def streamAwaitDsl[Value, That](
implicit executionContext: ExecutionContext): Dsl[Await[Value], Stream[Future[That]], Value] =
new Dsl[Await[Value], Stream[Future[That]], Value] {
def cpsApply(keyword: Await[Value], handler: Value => Stream[Future[That]]): Stream[Future[That]] = {
import keyword.future
val futureOfStream = future.map(handler)
new Stream.Cons(futureOfStream.flatMap(_.head), result(futureOfStream, Duration.Inf).tail)
}
}
implicit def awaitDsl[Value, That](
implicit executionContext: ExecutionContext): Dsl[Await[Value], Future[That], Value] =
new Dsl[Await[Value], Future[That], Value] {
def cpsApply(keyword: Await[Value], handler: Value => Future[That]): Future[That] = {
keyword.future.flatMap(handler)
}
}
}