Skip to content

Instantly share code, notes, and snippets.

Last active December 17, 2017 02:18
  • Star 15 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save viktorklang/4488970 to your computer and use it in GitHub Desktop.
* "Select" off the first future to be satisfied. Return this as a
* result, with the remainder of the Futures as a sequence.
* @param fs a scala.collection.Seq
def select[A](fs: Seq[Future[A]])(implicit ec: ExecutionContext): Future[(Try[A], Seq[Future[A]])] = {
def stripe(p: Promise[(Try[A], Seq[Future[A]])],
heads: Seq[Future[A]],
elem: Future[A],
tail: Seq[Future[A]]): Future[(Try[A], Seq[Future[A]])] = {
elem onComplete { res => if (!p.isCompleted) p.trySuccess((res, heads ++ tail)) }
if (tail.isEmpty) p.future
else stripe(p, heads :+ elem, tail.head, tail.tail)
if (fs.isEmpty) Future.failed(new IllegalArgumentException("empty future list!"))
else stripe(Promise(), fs.genericBuilder[Future[A]].result, fs.head, fs.tail)
Copy link

bblfish commented Mar 22, 2013

Thanks. I use this code to show how to transform a Seq[Future[X]] into an Enumerator[X]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment