Skip to content

Instantly share code, notes, and snippets.

@Nillerr
Created June 16, 2022 12:01
Show Gist options
  • Save Nillerr/551dd50c83065a8d9dfa88f3199196ca to your computer and use it in GitHub Desktop.
Save Nillerr/551dd50c83065a8d9dfa88f3199196ca to your computer and use it in GitHub Desktop.
import Combine
enum PublisherTimeoutError<Failure>: Error where Failure: Error {
case failure(Failure)
case timeout
}
extension Publisher {
func timeoutToNil<S>(after interval: S.SchedulerTimeType.Stride, scheduler: S) -> AnyPublisher<Output?, Failure> where S: Scheduler {
mapError({ error -> PublisherTimeoutError<Failure> in .failure(error) })
.map({ output -> Output? in output })
.timeout(interval, scheduler: scheduler, options: nil, customError: { .timeout })
.catch({ error -> AnyPublisher<Output?, Failure> in
switch error {
case let .failure(error):
return Fail(outputType: Output?.self, failure: error)
.eraseToAnyPublisher()
case .timeout:
return Just<Output?>(nil)
.setFailureType(to: Failure.self)
.eraseToAnyPublisher()
}
})
.eraseToAnyPublisher()
}
func firstOrNil<S>(timeout interval: S.SchedulerTimeType.Stride, scheduler: S) -> AnyPublisher<Output?, Failure> where S: Scheduler {
timeoutToNil(after: interval, scheduler: scheduler)
.first()
.eraseToAnyPublisher()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment