File tree Expand file tree Collapse file tree 3 files changed +57
-0
lines changed Expand file tree Collapse file tree 3 files changed +57
-0
lines changed Original file line number Diff line number Diff line change @@ -362,6 +362,12 @@ pub use self::traits::Iterator;
362362) ]
363363pub 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" ) ]
366372pub use self :: sources:: { empty, Empty } ;
367373#[ stable( feature = "iter_from_fn" , since = "1.34.0" ) ]
Original file line number Diff line number Diff line change 11mod empty;
22mod from_fn;
3+ mod from_generator;
34mod once;
45mod once_with;
56mod repeat;
@@ -21,6 +22,13 @@ pub use self::repeat_with::{repeat_with, RepeatWith};
2122#[ stable( feature = "iter_from_fn" , since = "1.34.0" ) ]
2223pub 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" ) ]
2533pub use self :: successors:: { successors, Successors } ;
2634
Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments