Skip to content

Commit 09deeec

Browse files
author
aleksandar
committed
Fix all combinator on futures, refactor execution context, remove disabled files.
1 parent 62bfdb1 commit 09deeec

File tree

7 files changed

+88
-1262
lines changed

7 files changed

+88
-1262
lines changed

src/library/scala/concurrent/AbstractPromise.java.disabled

Lines changed: 0 additions & 17 deletions
This file was deleted.

src/library/scala/concurrent/ExecutionContext.scala

Lines changed: 2 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,12 @@ package scala.concurrent
1111

1212

1313
import java.util.concurrent.{ Executors, Future => JFuture, Callable }
14-
import java.util.concurrent.atomic.{ AtomicInteger }
15-
import scala.util.{ Duration, Timeout }
14+
import scala.util.Duration
1615
import scala.concurrent.forkjoin.{ ForkJoinPool, RecursiveTask => FJTask, RecursiveAction, ForkJoinWorkerThread }
17-
import scala.collection.generic.CanBuildFrom
1816

1917

2018

21-
trait ExecutionContext {
19+
trait ExecutionContext extends ExecutionContextBase {
2220

2321
protected implicit object CanAwaitEvidence extends CanAwait
2422

@@ -36,80 +34,10 @@ trait ExecutionContext {
3634

3735
def blocking[T](awaitable: Awaitable[T], atMost: Duration): T
3836

39-
def futureUtilities: FutureUtilities = FutureUtilitiesImpl
40-
4137
}
4238

4339

4440
sealed trait CanAwait
4541

4642

47-
trait FutureUtilities {
48-
49-
/** TODO some docs
50-
*
51-
*/
52-
def all[T, Coll[X] <: Traversable[X]](futures: Coll[Future[T]])(implicit cbf: CanBuildFrom[Coll[_], T, Coll[T]]): Future[Coll[T]] = {
53-
val builder = cbf(futures)
54-
val p: Promise[Coll[T]] = promise[Coll[T]]
55-
56-
if (futures.size == 1) futures.head onComplete {
57-
case Left(t) => p failure t
58-
case Right(v) => builder += v
59-
p success builder.result
60-
} else {
61-
val restFutures = all(futures.tail)
62-
futures.head onComplete {
63-
case Left(t) => p failure t
64-
case Right(v) => builder += v
65-
restFutures onComplete {
66-
case Left(t) => p failure t
67-
case Right(vs) => for (v <- vs) builder += v
68-
p success builder.result
69-
}
70-
}
71-
}
72-
73-
p.future
74-
}
75-
76-
/** TODO some docs
77-
*
78-
*/
79-
def any[T](futures: Traversable[Future[T]]): Future[T] = {
80-
val futureResult = promise[T]()
81-
82-
val completeFirst: Either[Throwable, T] => Unit = futureElem => futureResult tryComplete futureElem
83-
84-
futures.foreach(_ onComplete completeFirst)
85-
86-
futureResult.future
87-
}
88-
89-
/** TODO some docs
90-
*
91-
*/
92-
def find[T](futures: Traversable[Future[T]])(predicate: T => Boolean): Future[Option[T]] = {
93-
if (futures.isEmpty) Promise.successful[Option[T]](None).future
94-
else {
95-
val result = promise[Option[T]]()
96-
val ref = new AtomicInteger(futures.size)
97-
val search: Either[Throwable, T] Unit = {
98-
v v match {
99-
case Right(r) if (predicate(r)) result trySuccess Some(r)
100-
case _
101-
}
102-
if (ref.decrementAndGet == 0) result trySuccess None
103-
}
104-
105-
futures.foreach(_ onComplete search)
106-
107-
result.future
108-
}
109-
}
110-
111-
}
112-
113-
object FutureUtilitiesImpl extends FutureUtilities {
114-
}
11543

src/library/scala/concurrent/Future.scala

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -355,8 +355,7 @@ self =>
355355

356356
p.future
357357
}
358-
359-
/*
358+
360359
/** Creates a new future which holds the result of either this future or `that` future, depending on
361360
* which future was completed first.
362361
*
@@ -370,20 +369,20 @@ self =>
370369
* await(0) h // evaluates to either 5 or throws a runtime exception
371370
* }}}
372371
*/
373-
def any[U >: T](that: Future[U]): Future[U] = {
372+
def either[U >: T](that: Future[U]): Future[U] = {
374373
val p = newPromise[U]
375374

376-
val completePromise: PartialFunction[Either[Throwable, T], _] = {
375+
val completePromise: PartialFunction[Either[Throwable, U], _] = {
377376
case Left(t) => p tryFailure t
378377
case Right(v) => p trySuccess v
379378
}
379+
380380
this onComplete completePromise
381381
that onComplete completePromise
382382

383383
p.future
384384
}
385-
386-
*/
385+
387386
}
388387

389388

@@ -399,14 +398,14 @@ object Future {
399398
/** TODO some docs
400399
*/
401400
def all[T, Coll[X] <: Traversable[X]](futures: Coll[Future[T]])(implicit cbf: CanBuildFrom[Coll[_], T, Coll[T]], ec: ExecutionContext): Future[Coll[T]] =
402-
ec.futureUtilities.all[T, Coll](futures)
401+
ec.all[T, Coll](futures)
403402

404403
// move this to future companion object
405404
@inline def apply[T](body: =>T)(implicit executor: ExecutionContext): Future[T] = executor.future(body)
406405

407-
def any[T](futures: Traversable[Future[T]])(implicit ec: ExecutionContext): Future[T] = ec.futureUtilities.any(futures)
406+
def any[T](futures: Traversable[Future[T]])(implicit ec: ExecutionContext): Future[T] = ec.any(futures)
408407

409-
def find[T](futures: Traversable[Future[T]])(predicate: T => Boolean)(implicit ec: ExecutionContext): Future[Option[T]] = ec.futureUtilities.find(futures)(predicate)
408+
def find[T](futures: Traversable[Future[T]])(predicate: T => Boolean)(implicit ec: ExecutionContext): Future[Option[T]] = ec.find(futures)(predicate)
410409

411410
}
412411

0 commit comments

Comments
 (0)