Created
August 14, 2012 10:02
-
-
Save viktorklang/3347939 to your computer and use it in GitHub Desktop.
A Linearized version of Sequence
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import scala.concurrent._ | |
import scala.collection.mutable.Builder | |
import scala.collection.generic.CanBuildFrom | |
import language.higherKinds | |
/** | |
* Linearize asynchrnously applies a given function in-order to a sequence of values, producing a Future with the result of the function applications. | |
* Execution of subsequent entries will be aborted if an exception is thrown in the application of the function. | |
*/ | |
def linearize[T, U, C[T] <: Traversable[T]](s: C[T])(f: T => U)(implicit cbf: CanBuildFrom[C[T], U, C[U]], e: ExecutionContext): Future[C[U]] = { | |
def next(i: Iterator[T], b: Builder[U, C[U]]): Future[C[U]] = if(!i.hasNext) Future successful b.result else Future { b += f(i.next()) } flatMap { b => next(i, b) } | |
next(s.toIterator, cbf(s)) | |
} | |
scala> linearize(1 to 100)(_.toString) foreach println | |
scala> Vector(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, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment