Open
Description
Since #67160 has been merged in December, having a GAT with lifetimes should be possible (See the StreamingIterator
example in that PR).
The current trait-defition of a coroutine is the following:
pub trait Coroutine<R = ()> {
type Yield;
type Return;
fn resume(
self: Pin<&mut Self>,
arg: R
) -> CoroutineState<Self::Yield, Self::Return>;
}
The issue here is that the Yield
can't be parameterized with a lifetime, so yielding a reference from a coroutine is not possible in its current state.
By using a GAT for the Yield
AT, it would be possible to return a local reference.
I also don't see why the resume argument type could not have been expressed with a GAT, so at the end we would use the following trait definition for a coroutine:
pub trait Coroutine {
type Resume<'a>;
type Yield<'a>;
type Return;
fn resume<'a, 'b>(
self: Pin<&'a mut Self>,
arg: Self::Resume<'b>
) -> CoroutineState<Self::Yield<'a>, Self::Return>;
}
Metadata
Assignees
Labels
Area: Generic associated types (GATs)Area: Associated items (types, constants & functions)Area: CoroutinesCategory: A feature request, i.e: not implemented / a PR.`#![feature(coroutines)]`Issues using the `generic_associated_types` feature that have been triagedRelevant to the language team, which will review and decide on the PR/issue.