Skip to content

Instantly share code, notes, and snippets.

@krzyzanowskim
Created December 15, 2024 00:40
Show Gist options
  • Save krzyzanowskim/6128b332e054c0e30d4ed15a4a8ae363 to your computer and use it in GitHub Desktop.
Save krzyzanowskim/6128b332e054c0e30d4ed15a4a8ae363 to your computer and use it in GitHub Desktop.
import AsyncAlgorithms
final class AsyncChannelObserverToken {
private let task: Task<Void, Error>
fileprivate init(_ task: Task<Void, Error>) {
self.task = task
}
func cancel() {
if !task.isCancelled {
task.cancel()
}
}
deinit {
cancel()
}
}
extension AsyncChannel {
func addObserver(@_inheritActorContext _ observer: @escaping @isolated(any) @Sendable (Element) -> Void) -> AsyncChannelObserverToken {
AsyncChannelObserverToken(Task {
for await value in self where !Task.isCancelled {
await observer(value)
}
})
}
}
// Usage
let observer = channel.addObserver { element in
//
}
// later
observer = nil
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment