Skip to content

Instantly share code, notes, and snippets.

@cabeca
Last active August 4, 2021 08:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cabeca/9c2cb9777f659232a74f1763f1f02681 to your computer and use it in GitHub Desktop.
Save cabeca/9c2cb9777f659232a74f1763f1f02681 to your computer and use it in GitHub Desktop.
AnyAsyncStream
#if swift(>=5.5)
@available(iOS 15.0, *)
struct AnyAsyncIterator<Element>: AsyncIteratorProtocol {
private let wrappedNext: () async throws -> Element?
init<I: AsyncIteratorProtocol>(_ asyncIterator: I) where I.Element == Element {
var asyncIterator = asyncIterator
wrappedNext = { try await asyncIterator.next() }
}
mutating func next() async throws -> Element? {
try await wrappedNext()
}
}
@available(iOS 15.0, *)
struct AnyAsyncSequence<Element>: AsyncSequence {
typealias AsyncIterator = AnyAsyncIterator<Element>
private let wrappedMakeAsyncIterator: AsyncIterator
init<S: AsyncSequence>(_ asyncSequence: S) where S.AsyncIterator.Element == AsyncIterator.Element {
wrappedMakeAsyncIterator = AnyAsyncIterator(asyncSequence.makeAsyncIterator())
}
__consuming func makeAsyncIterator() -> AsyncIterator {
wrappedMakeAsyncIterator
}
}
@available(iOS 15.0, *)
extension AsyncSequence {
func eraseToAnyAsyncSequence() -> AnyAsyncSequence<Element> {
AnyAsyncSequence(self)
}
}
#endif
@cabeca
Copy link
Author

cabeca commented Aug 2, 2021

Warning: Do not use this code in production. I have not tested it thoroughly. It may contain many bugs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment