]> git.lizzy.rs Git - rust.git/blob - library/core/src/iter/sources/from_generator.rs
Rollup merge of #97300 - ChayimFriedman2:patch-1, r=dtolnay
[rust.git] / library / core / src / iter / sources / from_generator.rs
1 use crate::ops::{Generator, GeneratorState};
2 use crate::pin::Pin;
3
4 /// Creates a new iterator where each iteration calls the provided generator.
5 ///
6 /// Similar to [`iter::from_fn`].
7 ///
8 /// [`iter::from_fn`]: crate::iter::from_fn
9 ///
10 /// # Examples
11 ///
12 /// ```
13 /// #![feature(generators)]
14 /// #![feature(iter_from_generator)]
15 ///
16 /// let it = std::iter::from_generator(|| {
17 ///     yield 1;
18 ///     yield 2;
19 ///     yield 3;
20 /// });
21 /// let v: Vec<_> = it.collect();
22 /// assert_eq!(v, [1, 2, 3]);
23 /// ```
24 #[inline]
25 #[unstable(feature = "iter_from_generator", issue = "43122", reason = "generators are unstable")]
26 pub fn from_generator<G: Generator<Return = ()> + Unpin>(
27     generator: G,
28 ) -> impl Iterator<Item = G::Yield> {
29     FromGenerator(generator)
30 }
31
32 struct FromGenerator<G>(G);
33
34 impl<G: Generator<Return = ()> + Unpin> Iterator for FromGenerator<G> {
35     type Item = G::Yield;
36
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,
41         }
42     }
43 }