Created
March 17, 2021 17:02
-
-
Save IanKeen/934258d2d5193160391e14d25e54b084 to your computer and use it in GitHub Desktop.
Extension to create an AnyPublisher to easily 'lift' async code into Combine
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
extension AnyPublisher where Failure: Error { | |
struct Subscriber { | |
fileprivate let send: (Output) -> Void | |
fileprivate let complete: (Subscribers.Completion<Failure>) -> Void | |
func send(_ value: Output) { self.send(value) } | |
func send(completion: Subscribers.Completion<Failure>) { self.complete(completion) } | |
} | |
init(_ closure: (Subscriber) -> AnyCancellable) { | |
let subject = PassthroughSubject<Output, Failure>() | |
let subscriber = Subscriber( | |
send: subject.send, | |
complete: subject.send(completion:) | |
) | |
let cancel = closure(subscriber) | |
self = subject | |
.handleEvents(receiveCancel: cancel.cancel) | |
.eraseToAnyPublisher() | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment