1+ /* __ *\
2+ ** ________ ___ / / ___ Scala API **
3+ ** / __/ __// _ | / / / _ | (c) 2003-2011, LAMP/EPFL **
4+ ** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
5+ ** /____/\___/_/ |_/____/_/ | | **
6+ ** |/ **
7+ \* */
8+
19package scala .concurrent
210
311
412
513import java .util .concurrent .{ Executors , Future => JFuture , Callable }
614import scala .util .{ Duration , Timeout }
715import scala .concurrent .forkjoin .{ ForkJoinPool , RecursiveTask => FJTask , RecursiveAction , ForkJoinWorkerThread }
16+ import scala .collection .generic .CanBuildFrom
817
918
1019
1120trait ExecutionContext {
1221
13- protected implicit object CanBlockEvidence extends CanBlock
22+ protected implicit object CanAwaitEvidence extends CanAwait
1423
1524 def execute (runnable : Runnable ): Unit
1625
@@ -22,12 +31,47 @@ trait ExecutionContext {
2231
2332 def future [T ](body : => T ): Future [T ]
2433
25- /** Only callable from the tasks running on the same execution context. */
26- def blockingCall [T ](timeout : Timeout , body : Awaitable [T ]): T
34+ def blocking [T ](atMost : Duration )(body : => T ): T
35+
36+ def blocking [T ](awaitable : Awaitable [T ], atMost : Duration ): T
37+
38+ def futureUtilities : FutureUtilities = FutureUtilitiesImpl
2739
2840}
2941
3042
31- sealed trait CanBlock
43+ sealed trait CanAwait
44+
45+
46+ trait FutureUtilities {
47+
48+ def all [T , Coll [X ] <: Traversable [X ]](futures : Coll [Future [T ]])(implicit cbf : CanBuildFrom [Coll [_], T , Coll [T ]]): Future [Coll [T ]] = {
49+ val builder = cbf(futures)
50+ val p : Promise [Coll [T ]] = promise[Coll [T ]]
51+
52+ if (futures.size == 1 ) futures.head onComplete {
53+ case Left (t) => p failure t
54+ case Right (v) => builder += v
55+ p success builder.result
56+ } else {
57+ val restFutures = all(futures.tail)
58+ futures.head onComplete {
59+ case Left (t) => p failure t
60+ case Right (v) => builder += v
61+ restFutures onComplete {
62+ case Left (t) => p failure t
63+ case Right (vs) => for (v <- vs) builder += v
64+ p success builder.result
65+ }
66+ }
67+ }
68+
69+ p.future
70+ }
71+
72+ }
3273
3374
75+ object FutureUtilitiesImpl extends FutureUtilities {
76+ }
77+
0 commit comments