import Combine extension Publisher { func retryWithDelay( retries: Int, delay: S.SchedulerTimeType.Stride, scheduler: S ) -> AnyPublisher where S: Scheduler { self .delayIfFailure(for: delay, scheduler: scheduler) .retry(retries) .eraseToAnyPublisher() } private func delayIfFailure( for delay: S.SchedulerTimeType.Stride, scheduler: S ) -> AnyPublisher where S: Scheduler { self.catch { error in Future { completion in scheduler.schedule(after: scheduler.now.advanced(by: delay)) { completion(.failure(error)) } } } .eraseToAnyPublisher() } }