File tree 3 files changed +57
-0
lines changed
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;
362
362
) ]
363
363
pub use self :: range:: Step ;
364
364
365
+ #[ unstable(
366
+ feature = "iter_from_generator" ,
367
+ issue = "43122" ,
368
+ reason = "generators are unstable"
369
+ ) ]
370
+ pub use self :: sources:: from_generator;
365
371
#[ stable( feature = "iter_empty" , since = "1.2.0" ) ]
366
372
pub use self :: sources:: { empty, Empty } ;
367
373
#[ stable( feature = "iter_from_fn" , since = "1.34.0" ) ]
Original file line number Diff line number Diff line change 1
1
mod empty;
2
2
mod from_fn;
3
+ mod from_generator;
3
4
mod once;
4
5
mod once_with;
5
6
mod repeat;
@@ -21,6 +22,13 @@ pub use self::repeat_with::{repeat_with, RepeatWith};
21
22
#[ stable( feature = "iter_from_fn" , since = "1.34.0" ) ]
22
23
pub use self :: from_fn:: { from_fn, FromFn } ;
23
24
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
+
24
32
#[ stable( feature = "iter_successors" , since = "1.34.0" ) ]
25
33
pub use self :: successors:: { successors, Successors } ;
26
34
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