Skip to content

Instantly share code, notes, and snippets.

@RyogaK
Last active March 24, 2017 11:58
Show Gist options
  • Save RyogaK/5f5b5b305bffc5b74d52a29d7c48ae5a to your computer and use it in GitHub Desktop.
Save RyogaK/5f5b5b305bffc5b74d52a29d7c48ae5a to your computer and use it in GitHub Desktop.
Observable の のエラーをキャッチして Result に入れて受け取ってマッチングして、という作業がめんどくさいと感じたのでオペレータを生やしてみた。
import RxSwift
import Result
public struct ResultErrorEnvelope: ErrorType {
let originError: ErrorType
}
public extension ObservableType {
public func catchAndConvertToResult() -> Observable<Result<E, ResultErrorEnvelope>> {
return map(Result.Success)
.catchError { error -> Observable<Result<E, ResultErrorEnvelope>> in
return .just(.Failure(.init(originError: error)))
}
}
}
public extension ObservableType where E: ResultType {
public func filterSuccess() -> Observable<E.Value> {
return flatMap { element -> Observable<E.Value> in
guard let value = element.value else {
return Observable.empty()
}
return Observable.just(value)
}
}
public func filterFailure() -> Observable<E.Error> {
return flatMap { element -> Observable<E.Error> in
guard let error = element.error else {
return Observable.empty()
}
return Observable.just(error)
}
}
public func decomposeResult() -> (succeeded: Observable<E.Value>, failured: Observable<E.Error>) {
let shared = shareReplay(1)
return (shared.filterSuccess(), shared.filterFailure())
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment