Struct genawaiter::stack::Gen

source ·
pub struct Gen<'s, Y, R, F: Future> { /* private fields */ }
Expand description

This is a generator which can be stack-allocated.

See the module-level docs for examples.

Implementations§

source§

impl<'s, Y, R, F: Future> Gen<'s, Y, R, F>

source

pub unsafe fn new( shelf: &'s mut Shelf<Y, R, F>, producer: impl FnOnce(Co<'s, Y, R>) -> F ) -> Self

Creates a new generator from a function.

The state of the generator is stored in shelf, which will be pinned in place while this generator exists. The generator itself is movable, since it just holds a reference to the pinned state.

The function accepts a Co object, and returns a future. Every time the generator is resumed, the future is polled. Each time the future is polled, it should do one of two things:

  • Call co.yield_(), and then return Poll::Pending.
  • Drop the Co, and then return Poll::Ready.

Typically this exchange will happen in the context of an async fn.

§Safety

The Co object must not outlive the returned Gen. By time the generator completes (i.e., by time the producer’s Future returns Poll::Ready), the Co object should already have been dropped. If this invariant is not upheld, memory unsafety can result.

Afaik, the Rust compiler is not flexible enough to let you express this invariant in the type system, but I would love to be proven wrong!

§Examples
let mut shelf = Shelf::new();
let gen = unsafe { Gen::new(&mut shelf, producer) };
source

pub fn resume_with(&mut self, arg: R) -> GeneratorState<Y, F::Output>

Resumes execution of the generator.

arg is the resume argument. If the generator was previously paused by awaiting a future returned from co.yield(), that future will complete, and return arg.

If the generator yields a value, Yielded is returned. Otherwise, Completed is returned.

See the module-level docs for examples.

source§

impl<'s, Y, F: Future> Gen<'s, Y, (), F>

source

pub fn resume(&mut self) -> GeneratorState<Y, F::Output>

Resumes execution of the generator.

If the generator yields a value, Yielded is returned. Otherwise, Completed is returned.

See the module-level docs for examples.

source

pub fn async_resume( &mut self ) -> impl Future<Output = GeneratorState<Y, F::Output>> + '_

Resumes execution of the generator.

If the generator pauses without yielding, Poll::Pending is returned. If the generator yields a value, Poll::Ready(Yielded) is returned. Otherwise, Poll::Ready(Completed) is returned.

See the module-level docs for examples.

Trait Implementations§

source§

impl<'s, Y, R, F: Future> Coroutine for Gen<'s, Y, R, F>

§

type Yield = Y

The type of value this generator yields.
§

type Resume = R

The type of value this generator accepts as a resume argument.
§

type Return = <F as Future>::Output

The type of value this generator returns upon completion.
source§

fn resume_with( self: Pin<&mut Self>, arg: R ) -> GeneratorState<Self::Yield, Self::Return>

Resumes the execution of this generator. Read more
source§

impl<'s, Y, R, F: Future> Drop for Gen<'s, Y, R, F>

source§

fn drop(&mut self)

Executes the destructor for this type. Read more
source§

impl<'r, 's, Y, F: Future<Output = ()>> IntoIterator for &'r mut Gen<'s, Y, (), F>

§

type Item = Y

The type of the elements being iterated over.
§

type IntoIter = MutIntoIter<'r, 's, Y, F>

Which kind of iterator are we turning this into?
source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more
source§

impl<'s, Y, F: Future<Output = ()>> IntoIterator for Gen<'s, Y, (), F>

§

type Item = Y

The type of the elements being iterated over.
§

type IntoIter = IntoIter<'s, Y, F>

Which kind of iterator are we turning this into?
source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more

Auto Trait Implementations§

§

impl<'s, Y, R, F> Freeze for Gen<'s, Y, R, F>

§

impl<'s, Y, R, F> !RefUnwindSafe for Gen<'s, Y, R, F>

§

impl<'s, Y, R, F> Send for Gen<'s, Y, R, F>
where F: Send, Y: Send, R: Send,

§

impl<'s, Y, R, F> !Sync for Gen<'s, Y, R, F>

§

impl<'s, Y, R, F> Unpin for Gen<'s, Y, R, F>

§

impl<'s, Y, R, F> !UnwindSafe for Gen<'s, Y, R, F>

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<C> Generator for C
where C: Coroutine<Resume = ()>,

§

type Yield = <C as Coroutine>::Yield

The type of value this generator yields.
§

type Return = <C as Coroutine>::Return

The type of value this generator returns upon completion.
source§

fn resume( self: Pin<&mut C> ) -> GeneratorState<<C as Generator>::Yield, <C as Generator>::Return>

Resumes the execution of this generator.
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.