Last active
August 4, 2021 08:23
-
-
Save cabeca/9c2cb9777f659232a74f1763f1f02681 to your computer and use it in GitHub Desktop.
AnyAsyncStream
This file contains 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
#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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Warning: Do not use this code in production. I have not tested it thoroughly. It may contain many bugs.