in client/src/main/scala/com.gu.contentapi.client/BackoffStrategy.scala [88:98]
def withRetry[A](backoffStrategy: BackoffStrategy, retryPredicate: A => Boolean)(operation: RetryAttempt => Future[A])(implicit executor: ScheduledExecutor, ec: ExecutionContext): Future[A] = {
def loop(backoffStrategy: BackoffStrategy): Future[A] = backoffStrategy match {
case r: Retryable => operation(r.attempts).flatMap {
case result if retryPredicate(result) => executor.sleepFor(r.delay).flatMap(_ => loop(backoffStrategy.increment))
case result => Future.successful(result)
}
case RetryFailed(attempts) =>
Future.failed(ContentApiBackoffException(s"Backoff failed after $attempts attempts"))
}
loop(backoffStrategy)
}