Me gustaría extender AsyncSequence de manera que dependa de si la secuencia puede lanzar. Ni AsyncSequence ni AsyncIteratorProtocol distinguen dichas secuencias explícitamente. Sin embargo, el módulo de concurrencia viene con secuencias concretas con variantes de lanzamiento y no lanzamiento. La única diferencia genérica que veo es que el next método de secuencias sin lanzamiento es el lanzamiento. Aquí hay un ejemplo:
extension AsyncMapSequence : AsyncSequence { struct Iterator : AsyncIteratorProtocol { mutating func next() async rethrows -> Transformed? } } Mientras que la variante de lanzamiento es un throws simple:
extension AsyncThrowingMapSequence : AsyncSequence { struct Iterator : AsyncIteratorProtocol { mutating func next() async throws -> Transformed? } } (Ni siquiera estoy seguro de cómo es posible rethrows a lanzar para un método que no acepta ningún argumento. Lo único que se me ocurre es que la expresión curry de dicho método podría arrojar algo de luz sobre eso...)
Entonces, la pregunta es cómo expresar algo como:
extension AsyncSequence where AsyncIterator /* is not throwing */ { }Cuando esta propuesta se implemente por completo, podrá expresar la conformidad con una secuencia fallida proporcionando algo de azúcar de sintaxis.
extension AsyncSequence where nothrow AsyncIterator {o
struct Foo<S: nothrow AsyncSequence> Esto proviene de la anotación @rethrows actualmente adjunta a AsyncSequence
@rethrows public protocol AsyncSequence