Suppose I've got a function foo that performs asynchronous computation and returns a Future:
def foo(x: Int)(implicit ec: ExecutionContext): Future[Int] = ???
Now I'd like to retry this computation n times until the computation succeeds.
def retryFoo(x: Int, n: Int)(implicit ec: ExecutionContext): Future[Int] = ???
I would like also to return all exceptions thrown while retrying. So, I define new exception class ExceptionsList and require retryFoo to return ExceptionsList when all retries fail.
case class ExceptionsList(es: List[Exception]) extends Exception { ... }
How would you write retryFoo to retry foo and return a Future with either the foo result or ExceptionsList ?