Skip to content

Yield reference in coroutine with GATΒ #69268

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>;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

No one assigned

    Labels

    A-GATsArea: Generic associated types (GATs)A-associated-itemsArea: Associated items (types, constants & functions)A-coroutinesArea: CoroutinesC-feature-requestCategory: A feature request, i.e: not implemented / a PR.F-coroutines`#![feature(coroutines)]`GATs-triagedIssues using the `generic_associated_types` feature that have been triagedT-langRelevant to the language team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions