1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
use super::*;
pub struct IteratorGenerator<I>(I);
impl<I: Iterator> Generator for IteratorGenerator<I> {
type Yield = I::Item;
type Return = ();
fn resume(&mut self) -> GeneratorState<Self::Yield, Self::Return> {
match self.0.next() {
Some(i) => GeneratorState::Yielded(i),
None => GeneratorState::Completed(()),
}
}
}
pub struct GeneratorIterator<G>(G);
impl<G: Generator<Return = ()>> Iterator for GeneratorIterator<G> {
type Item = G::Yield;
fn next(&mut self) -> Option<Self::Item> {
match self.0.resume() {
GeneratorState::Yielded(y) => Some(y),
GeneratorState::Completed(()) => None,
}
}
}