def withRetry[A]()

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)
  }