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>;
}