7
7
//! #![feature(generators)]
8
8
//! #![feature(conservative_impl_trait)]
9
9
//!
10
- //! extern crate gen_iter;
11
- //! use gen_iter::GenIter;
10
+ //! use gen_iter::gen_iter;
12
11
//!
13
12
//! fn fibonacci() -> impl Iterator<Item = u64> {
14
- //! GenIter(|| {
13
+ //! gen_iter!( {
15
14
//! let mut a = 0;
16
15
//! let mut b = 1;
17
16
//!
25
24
//! })
26
25
//! }
27
26
//!
28
- //! fn main() {
29
- //! for elem in fibonacci().map(|x| 2 * x).take(10) {
30
- //! println!("{}", elem);
31
- //! }
27
+ //! for elem in fibonacci().map(|x| 2 * x).take(10) {
28
+ //! println!("{}", elem);
32
29
//! }
33
30
//! ```
34
31
//!
38
35
39
36
use std:: ops:: { Generator , GeneratorState } ;
40
37
use std:: iter:: Iterator ;
38
+ use std:: marker:: Unpin ;
39
+ use std:: pin:: Pin ;
41
40
42
41
/// a iterator that holds an internal generator representing
43
42
/// the iteration state
44
43
#[ derive( Copy , Clone , Debug ) ]
45
44
pub struct GenIter < T > ( pub T )
46
45
where
47
- T : Generator < Return = ( ) > ;
46
+ T : Generator < Return = ( ) > + Unpin ;
48
47
49
48
impl < T > Iterator for GenIter < T >
50
49
where
51
- T : Generator < Return = ( ) > ,
50
+ T : Generator < Return = ( ) > + Unpin ,
52
51
{
53
52
type Item = T :: Yield ;
54
53
55
54
#[ inline]
56
55
fn next ( & mut self ) -> Option < Self :: Item > {
57
- match self . 0 . resume ( ) {
56
+ match Pin :: new ( & mut self . 0 ) . resume ( ( ) ) {
58
57
GeneratorState :: Yielded ( n) => Some ( n) ,
59
58
GeneratorState :: Complete ( ( ) ) => None ,
60
59
}
63
62
64
63
impl < G > From < G > for GenIter < G >
65
64
where
66
- G : Generator < Return = ( ) > ,
65
+ G : Generator < Return = ( ) > + Unpin ,
67
66
{
68
67
#[ inline]
69
68
fn from ( gen : G ) -> Self {
@@ -75,29 +74,24 @@ where
75
74
/// macro to simplify iterator - via - generator construction
76
75
///
77
76
/// ```
78
- /// # # ![feature(generators)];
79
- /// # #[macro_use]
80
- /// # extern crate gen_iter;
81
- /// # fn main() {
82
- /// let mut g = gen_iter! {
77
+ /// #![feature(generators)]
78
+ ///
79
+ /// use gen_iter:: gen_iter;
80
+ ///
81
+ /// let mut g = gen_iter!( {
83
82
/// yield 1;
84
83
/// yield 2;
85
- /// };
86
- ///
84
+ /// });
87
85
///
88
86
/// assert_eq!(g.next(), Some(1));
89
87
/// assert_eq!(g.next(), Some(2));
90
88
/// assert_eq!(g.next(), None);
91
89
///
92
- ///
93
- /// # }
94
90
/// ```
95
91
#[ macro_export]
96
92
macro_rules! gen_iter {
97
- ( $( $exp: tt) * ) => {
98
- $crate:: GenIter ( || {
99
- $( $exp) *
100
- } )
93
+ ( $block: block) => {
94
+ $crate:: GenIter ( || $block)
101
95
}
102
96
}
103
97
@@ -108,7 +102,7 @@ mod tests {
108
102
109
103
#[ test]
110
104
fn it_works ( ) {
111
- let mut g = GenIter ( || {
105
+ let mut g = gen_iter ! ( {
112
106
yield 1 ;
113
107
yield 2 ;
114
108
} ) ;
@@ -120,10 +114,10 @@ mod tests {
120
114
121
115
#[ test]
122
116
fn into_gen_iter ( ) {
123
- let mut g: GenIter < _ > = ( || {
117
+ let mut g: GenIter < _ > = gen_iter ! ( {
124
118
yield 1 ;
125
119
yield 2 ;
126
- } ) . into ( ) ;
120
+ } ) ;
127
121
128
122
assert_eq ! ( g. next( ) , Some ( 1 ) ) ;
129
123
assert_eq ! ( g. next( ) , Some ( 2 ) ) ;
@@ -132,10 +126,10 @@ mod tests {
132
126
133
127
#[ test]
134
128
fn gen_iter_macro ( ) {
135
- let mut g = gen_iter ! {
129
+ let mut g = gen_iter ! ( {
136
130
yield 1 ;
137
131
yield 2 ;
138
- } ;
132
+ } ) ;
139
133
140
134
assert_eq ! ( g. next( ) , Some ( 1 ) ) ;
141
135
assert_eq ! ( g. next( ) , Some ( 2 ) ) ;
0 commit comments