There is no get rethrows
. Is it coming?
To get around it, I had the thought that maybe you could do this…
public protocol AsyncThrowingSequence: AsyncSequence { }
public extension AsyncThrowingSequence {
var collected: [Element] {
get async throws { try await .init(self) }
}
}
extension AsyncThrowingCompactMapSequence: AsyncThrowingSequence { }
extension AsyncThrowingDropWhileSequence: AsyncThrowingSequence { }
extension AsyncThrowingFilterSequence: AsyncThrowingSequence { }
extension AsyncThrowingFlatMapSequence: AsyncThrowingSequence { }
extension AsyncThrowingMapSequence: AsyncThrowingSequence { }
extension AsyncThrowingPrefixWhileSequence: AsyncThrowingSequence { }
extension AsyncThrowingStream: AsyncThrowingSequence { }
extension ThrowingTaskGroup: AsyncThrowingSequence { }
public protocol AsyncNonThrowingSequence: AsyncSequence { }
public extension AsyncNonThrowingSequence {
var collected: [Element] {
get async { try! await .init(self) }
}
}
extension AsyncCompactMapSequence: AsyncNonThrowingSequence { }
extension AsyncDropFirstSequence: AsyncNonThrowingSequence { }
extension AsyncDropWhileSequence: AsyncNonThrowingSequence { }
extension AsyncFilterSequence: AsyncNonThrowingSequence { }
extension AsyncFlatMapSequence: AsyncNonThrowingSequence { }
extension AsyncMapSequence: AsyncNonThrowingSequence { }
extension AsyncPrefixSequence: AsyncNonThrowingSequence { }
extension AsyncPrefixWhileSequence: AsyncNonThrowingSequence { }
extension AsyncStream: AsyncNonThrowingSequence { }
extension TaskGroup: AsyncNonThrowingSequence { }
public extension Array {
init<AsyncSequence: _Concurrency.AsyncSequence>(_ asyncSequence: AsyncSequence) async rethrows
where AsyncSequence.Element == Element {
self = try await asyncSequence.reduce(into: []) { $0.append($1) }
}
}
…but no. These sequences that do not throw can wrap ones that do, e.g.:
AsyncMapSequence<
AsyncThrowingMapSequence<Sequence, Element>,
Element
>
…and so try!
at the AsyncNonThrowingSequence
level is unsafe.
What's the intended solution?
- Use
try!
at call site, when none of those nested placeholder types haveThrowing
in the name. - Use
try
even though we're aware errors are impossible. - Continue to avoid properties in favor of methods, as we did before properties could throw.