Guest User

Untitled

a guest
Jan 16th, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.09 KB | None | 0 0
  1. package sandbox.futures
  2.  
  3. import scala.collection.generic.CanBuildFrom
  4. import scala.concurrent._
  5. import scala.concurrent.duration._
  6. import scala.language.higherKinds
  7. import scala.util.{Random, Success}
  8. import scala.util.control.NoStackTrace
  9.  
  10. object FailFastTraverse {
  11.  
  12. def traverse[A, B, M[X] <: TraversableOnce[X]](in: M[A])(fn: A => Future[B])(
  13. implicit cbf: CanBuildFrom[M[A], B, M[B]],
  14. ec: ExecutionContext): Future[M[B]] =
  15. in.foldLeft(Future.successful(cbf(in))) { (fr, a) =>
  16. fr.transformWith {
  17. case _: Success[_] => fr.zipWith(fn(a))(_ += _)
  18. case _ => fr
  19. }
  20. }
  21. .map(_.result())
  22. }
  23.  
  24. object FailFastTest extends App {
  25. import scala.concurrent.ExecutionContext.Implicits.global
  26.  
  27. def sleep(): Unit = {
  28. Thread.sleep(100 + Random.nextInt(5000))
  29. }
  30.  
  31. val result = FailFastTraverse.traverse(1 to 100) { n =>
  32. sleep()
  33. println(n)
  34. if (Random.nextBoolean()) Future.successful(n)
  35. else {
  36. println("failing!")
  37. Future.failed(new Exception("ka-poom") with NoStackTrace)
  38. }
  39. }
  40.  
  41. Await.result(result, 3.minutes)
  42. }
Add Comment
Please, Sign In to add comment