Skip to content

Instantly share code, notes, and snippets.

@banjun
Last active August 1, 2017 03:01
Show Gist options
  • Save banjun/58e6bd0adb191646755c0cbfd4aa7f2e to your computer and use it in GitHub Desktop.
Save banjun/58e6bd0adb191646755c0cbfd4aa7f2e to your computer and use it in GitHub Desktop.
ReactiveSwift: send SignalProducer as value and get Future for the SignalProducer completion
extension SignalProducerProtocol {
func resolveFuture(_ resolver: @escaping (Result<Value, Error>) -> Void) -> SignalProducer<Value, Error> {
return on(value: {resolver(.success($0))})
.on(failed: {resolver(.failure($0))})
}
// create SignalProducer that create Future with the autoclosure on start and send a result to the inner observer
init(_ future: @escaping @autoclosure (Void) -> Future<Value, Error>) {
self.init { observer, _ in
future().onSuccess {observer.send(value: $0)}
.onFailure {observer.send(error: $0)}
.onComplete {_ in observer.sendCompleted()}
}
}
}
extension Observer {
/// send value and return Future for the SignalProducer completion
func sendAndGetFuture<V, E>(value: SignalProducer<V, E>) -> Future<V, E> where Value == SignalProducer<V, E> {
return Future {
self.send(value: value.resolveFuture($0))
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment