pub trait Generator {
type Output;
// Required method
fn run(
&mut self,
output: impl FnMut(Self::Output) -> ValueResult
) -> GeneratorResult;
// Provided method
fn try_advance(&mut self, n: NonZeroUsize) -> (usize, GeneratorResult) { ... }
}
Expand description
Trait for generating values into a closure.
When a Generator
is run()
it generates values that are fed an output
closure.
It continues to feed values to the closure for as long as it can, unless the closure returns
ValueResult::Stop
.
When all values have been generated the run()
method returns GeneratorResult::Complete
.
If output
returns ValueResult::Stop
for any value
the generator must not call output
with any further values and return GeneratorResult::Stopped
as well.
The generator must not assume that it won’t be called again after it returns.
Example
A generic generator can be written like this:
use pushgen::{Generator, ValueResult, GeneratorResult};
struct GenericGenerator<Out, Gen>
where
Gen: FnMut() -> Option<Out>,
{
generator: Gen,
}
impl<Out, Gen> Generator for GenericGenerator<Out, Gen>
where
Gen: FnMut() -> Option<Out>,
{
type Output = Out;
fn run(&mut self, mut output: impl FnMut(Self::Output) -> ValueResult) -> GeneratorResult {
while let Some(value) = (self.generator)() {
if output(value) == ValueResult::Stop {
return GeneratorResult::Stopped;
}
}
GeneratorResult::Complete
}
}
Required Associated Types§
Required Methods§
sourcefn run(
&mut self,
output: impl FnMut(Self::Output) -> ValueResult
) -> GeneratorResult
fn run( &mut self, output: impl FnMut(Self::Output) -> ValueResult ) -> GeneratorResult
Run the generator, emitting values to the output
closure.
New values are emitted for
as long as the closure returns ValueResult::MoreValues
.
If the closure returns ValueResult::Stop
the generator must
return GeneratorResult::Stopped
.
Provided Methods§
sourcefn try_advance(&mut self, n: NonZeroUsize) -> (usize, GeneratorResult)
fn try_advance(&mut self, n: NonZeroUsize) -> (usize, GeneratorResult)
Try to advance the generator n
values, ignoring them.
This function has a default implementation but should be implemented by adaptors and source generators for additional performance gains.
Returns
The number of steps that the generator was actually advanced, and if the generator was stopped or completed.
Examples
use pushgen::{IntoGenerator, Generator, GeneratorExt, GeneratorResult};
use core::num::NonZeroUsize;
let data = [1, 2, 3, 4, 5];
let mut gen = data.into_gen();
let advance_result = gen.try_advance(NonZeroUsize::new(3).unwrap());
assert_eq!(advance_result, (3, GeneratorResult::Stopped));
assert_eq!(gen.next(), Ok(4));
assert_eq!(gen.next(), Ok(5));
Implementations on Foreign Types§
source§impl<T: Generator> Generator for &mut T
impl<T: Generator> Generator for &mut T
type Output = <T as Generator>::Output
fn run( &mut self, output: impl FnMut(Self::Output) -> ValueResult ) -> GeneratorResult
fn try_advance(&mut self, n: NonZeroUsize) -> (usize, GeneratorResult)
Implementors§
source§impl<'a, Src, T> Generator for Cloned<Src>where
T: 'a + Clone,
Src: Generator<Output = &'a T>,
impl<'a, Src, T> Generator for Cloned<Src>where T: 'a + Clone, Src: Generator<Output = &'a T>,
source§impl<'a, Src, T> Generator for Copied<Src>where
T: 'a + Copy,
Src: Generator<Output = &'a T>,
impl<'a, Src, T> Generator for Copied<Src>where T: 'a + Copy, Src: Generator<Output = &'a T>,
source§impl<'a, T> Generator for MultiStoppingGen<'a, T>
Available on crate feature test
only.
impl<'a, T> Generator for MultiStoppingGen<'a, T>
test
only.source§impl<'a, T> Generator for StoppingGen<'a, T>
Available on crate feature test
only.
impl<'a, T> Generator for StoppingGen<'a, T>
test
only.