Skip to content

Instantly share code, notes, and snippets.

@Koshimizu-Takehito
Last active March 31, 2019 08:34
Show Gist options
  • Save Koshimizu-Takehito/d2fb17262835bed6a75cc237daf9055d to your computer and use it in GitHub Desktop.
Save Koshimizu-Takehito/d2fb17262835bed6a75cc237daf9055d to your computer and use it in GitHub Desktop.
split Signal/SignalProducer
import ReactiveCocoa
import ReactiveSwift
extension SignalProducer {
func result() -> SignalProducer<Result<Value, Error>, Never> {
return map(Swift.Result<Value, Error>.success)
.flatMapError { SignalProducer<Result<Value, Error>, Never>(value: .failure($0)) }
}
}
extension Signal {
func result() -> Signal<Result<Value, Error>, Never> {
return map(Swift.Result<Value, Error>.success)
.flatMapError { SignalProducer<Result<Value, Error>, Never>(value: .failure($0)) }
}
func split() -> (value: Signal<Value, Never>, error: Signal<Error, Never>) {
let result = self.result()
return (
value: result
.filter(ResultUtil.isSuccess)
.map(ResultUtil.valueOrNil)
.skipNil(),
error: result
.filter(ResultUtil.isFailure)
.map(ResultUtil.errorOrNil)
.skipNil())
}
}
private enum ResultUtil {
static func isSuccess<Value, Error>(_ result: Result<Value, Error>) -> Bool {
switch result {
case .success:
return true
default:
return false
}
}
static func isFailure<Value, Error>(_ result: Result<Value, Error>) -> Bool {
return !isSuccess(result)
}
static func valueOrNil<Value, Error>(_ result: Result<Value, Error>) -> Value? {
switch result {
case let .success(value):
return value
default:
return nil
}
}
static func errorOrNil<Value, Error>(_ result: Result<Value, Error>) -> Error? {
switch result {
case let .failure(value):
return value
default:
return nil
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment