Skip to content

Commit 94319c1

Browse files
committed
libcore: Add iter::from_generator which is like iter::from_fn, but for coroutines instead of functions
1 parent 9881cf0 commit 94319c1

File tree

3 files changed

+57
-0
lines changed

3 files changed

+57
-0
lines changed

core/src/iter/mod.rs

+6
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,12 @@ pub use self::traits::Iterator;
362362
)]
363363
pub use self::range::Step;
364364

365+
#[unstable(
366+
feature = "iter_from_generator",
367+
issue = "43122",
368+
reason = "generators are unstable"
369+
)]
370+
pub use self::sources::from_generator;
365371
#[stable(feature = "iter_empty", since = "1.2.0")]
366372
pub use self::sources::{empty, Empty};
367373
#[stable(feature = "iter_from_fn", since = "1.34.0")]

core/src/iter/sources.rs

+8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
mod empty;
22
mod from_fn;
3+
mod from_generator;
34
mod once;
45
mod once_with;
56
mod repeat;
@@ -21,6 +22,13 @@ pub use self::repeat_with::{repeat_with, RepeatWith};
2122
#[stable(feature = "iter_from_fn", since = "1.34.0")]
2223
pub use self::from_fn::{from_fn, FromFn};
2324

25+
#[unstable(
26+
feature = "iter_from_generator",
27+
issue = "43122",
28+
reason = "generators are unstable"
29+
)]
30+
pub use self::from_generator::from_generator;
31+
2432
#[stable(feature = "iter_successors", since = "1.34.0")]
2533
pub use self::successors::{successors, Successors};
2634

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
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+
}

0 commit comments

Comments
 (0)