Skip to content

Instantly share code, notes, and snippets.

@atierian
Forked from IanKeen/Publisher+Result.swift
Last active September 30, 2021 12:41
Show Gist options
  • Save atierian/f48199f8e83296596571fa54e69b9160 to your computer and use it in GitHub Desktop.
Save atierian/f48199f8e83296596571fa54e69b9160 to your computer and use it in GitHub Desktop.
Extension to convert a failable Publisher into a non-failable Result based publisher (as well as extensions to break out values/errors) - Same idea as RxSwifts Materialize
extension Publisher {
func asResult() -> AnyPublisher<Result<Output, Failure>, Never> {
return map(Result.success)
.catch { Just(Result.failure($0)) }
.eraseToAnyPublisher()
}
}
extension Publisher {
func values<S, F: Error>() -> AnyPublisher<S, Never> where Output == Result<S, F>, Failure == Never {
return flatMap { (result) -> AnyPublisher<S, Never> in
switch result {
case .success(let value):
return Just(value).eraseToAnyPublisher()
case .failure:
return Empty().eraseToAnyPublisher()
}
}.eraseToAnyPublisher()
}
func errors<S, F: Error>() -> AnyPublisher<F, Never> where Output == Result<S, F>, Failure == Never {
return flatMap { (result) -> AnyPublisher<F, Never> in
switch result {
case .success:
return Empty().eraseToAnyPublisher()
case .failure(let error):
return Just(error).eraseToAnyPublisher()
}
}.eraseToAnyPublisher()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment