From a76e62096f86b391fb8eba15b75a0f2234e824e5 Mon Sep 17 00:00:00 2001 From: Derek Williams Date: Fri, 25 Feb 2011 07:30:31 -0700 Subject: [PATCH] Specialized traverse and sequence methods for Traversable[Future[A]] => Future[Traversable[A]] --- akka-actor/src/main/scala/akka/dispatch/Future.scala | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/akka-actor/src/main/scala/akka/dispatch/Future.scala b/akka-actor/src/main/scala/akka/dispatch/Future.scala index 5c1f37973c..bf23ab91d9 100644 --- a/akka-actor/src/main/scala/akka/dispatch/Future.scala +++ b/akka-actor/src/main/scala/akka/dispatch/Future.scala @@ -129,7 +129,14 @@ object Futures { } } + import scala.collection.mutable.Builder + import scala.collection.generic.CanBuildFrom + def sequence[A, M[_] <: Traversable[_]](in: M[Future[A]], timeout: Long = Actor.TIMEOUT)(implicit cbf: CanBuildFrom[M[Future[A]], A, M[A]]): Future[M[A]] = + in.foldLeft(new DefaultCompletableFuture[Builder[A, M[A]]](timeout).completeWithResult(cbf(in)): Future[Builder[A, M[A]]])((fb, fa) => for (a <- fa.asInstanceOf[Future[A]]; b <- fb) yield (b += a)).map(_.result) + + def traverse[A, B, M[_] <: Traversable[_]](in: M[A], timeout: Long = Actor.TIMEOUT)(fn: A => Future[B])(implicit cbf: CanBuildFrom[M[A], B, M[B]]): Future[M[B]] = + in.foldLeft(new DefaultCompletableFuture[Builder[B, M[B]]](timeout).completeWithResult(cbf(in)): Future[Builder[B, M[B]]])((fb, fa) => for (a <- fn(fa.asInstanceOf[A]); b <- fb) yield (b += a)).map(_.result) } sealed trait Future[T] {