1 use crate::ops::{Generator, GeneratorState};
4 /// Creates a new iterator where each iteration calls the provided generator.
6 /// Similar to [`iter::from_fn`].
8 /// [`iter::from_fn`]: crate::iter::from_fn
13 /// #![feature(generators)]
14 /// #![feature(iter_from_generator)]
16 /// let it = std::iter::from_generator(|| {
21 /// let v: Vec<_> = it.collect();
22 /// assert_eq!(v, [1, 2, 3]);
25 #[unstable(feature = "iter_from_generator", issue = "43122", reason = "generators are unstable")]
26 pub fn from_generator<G: Generator<Return = ()> + Unpin>(
28 ) -> impl Iterator<Item = G::Yield> {
29 FromGenerator(generator)
32 struct FromGenerator<G>(G);
34 impl<G: Generator<Return = ()> + Unpin> Iterator for FromGenerator<G> {
37 fn next(&mut self) -> Option<Self::Item> {
38 match Pin::new(&mut self.0).resume(()) {
39 GeneratorState::Yielded(n) => Some(n),
40 GeneratorState::Complete(()) => None,