@@ -139,31 +139,19 @@ pub struct TupleWindows<I, T>
139
139
where I : Iterator < Item = T :: Item > ,
140
140
T : HomogeneousTuple
141
141
{
142
- iter : I ,
142
+ iter : Fuse < I > ,
143
143
last : Option < T > ,
144
144
}
145
145
146
146
/// Create a new tuple windows iterator.
147
- pub fn tuple_windows < I , T > ( mut iter : I ) -> TupleWindows < I , T >
147
+ pub fn tuple_windows < I , T > ( iter : I ) -> TupleWindows < I , T >
148
148
where I : Iterator < Item = T :: Item > ,
149
149
T : HomogeneousTuple ,
150
150
T :: Item : Clone
151
151
{
152
- use std:: iter:: once;
153
-
154
- let mut last = None ;
155
- if T :: num_items ( ) != 1 {
156
- // put in a duplicate item in front of the tuple; this simplifies
157
- // .next() function.
158
- if let Some ( item) = iter. next ( ) {
159
- let iter = once ( item. clone ( ) ) . chain ( once ( item) ) . chain ( & mut iter) ;
160
- last = T :: collect_from_iter_no_buf ( iter) ;
161
- }
162
- }
163
-
164
152
TupleWindows {
165
- last,
166
- iter,
153
+ last : None ,
154
+ iter : iter . fuse ( ) ,
167
155
}
168
156
}
169
157
@@ -183,13 +171,20 @@ impl<I, T> Iterator for TupleWindows<I, T>
183
171
last. left_shift_push ( new) ;
184
172
return Some ( last. clone ( ) ) ;
185
173
}
174
+ } else {
175
+ use std:: iter:: once;
176
+ if let Some ( item) = self . iter . next ( ) {
177
+ let iter = once ( item) . chain ( & mut self . iter ) ;
178
+ self . last = T :: collect_from_iter_no_buf ( iter) ;
179
+ return self . last . clone ( ) ;
180
+ }
186
181
}
187
182
None
188
183
}
189
184
}
190
185
191
186
impl < I , T > FusedIterator for TupleWindows < I , T >
192
- where I : FusedIterator < Item = T :: Item > ,
187
+ where I : Iterator < Item = T :: Item > ,
193
188
T : HomogeneousTuple + Clone ,
194
189
T :: Item : Clone
195
190
{ }
0 commit comments