Skip to content

Instantly share code, notes, and snippets.

@IanKeen
Last active June 26, 2025 18:30
Show Gist options
  • Save IanKeen/934258d2d5193160391e14d25e54b084 to your computer and use it in GitHub Desktop.
Save IanKeen/934258d2d5193160391e14d25e54b084 to your computer and use it in GitHub Desktop.
Extension to create an AnyPublisher to easily 'lift' async code into Combine
extension AnyPublisher where Failure: Error {
struct Subscriber: Sendable {
fileprivate let send: @Sendable (Output) -> Void
fileprivate let complete: @Sendable (Subscribers.Completion<Failure>) -> Void
func send(_ value: Output) { self.send(value) }
func send(completion: Subscribers.Completion<Failure>) { self.complete(completion) }
}
init(_ closure: (Subscriber) -> AnyCancellable) {
nonisolated(unsafe) let subject = PassthroughSubject<Output, Failure>()
let subscriber = Subscriber(
send: { subject.send($0) },
complete: { subject.send(completion: $0) }
)
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