Skip to content

Commit 6c6aa7e

Browse files
aobatactjswrenn
authored andcommitted
Fix tuple_windows as lazy
1 parent 0897f56 commit 6c6aa7e

File tree

1 file changed

+12
-14
lines changed

1 file changed

+12
-14
lines changed

src/tuple_impl.rs

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -167,30 +167,21 @@ where
167167
I: Iterator<Item = T::Item>,
168168
T: HomogeneousTuple,
169169
{
170-
iter: I,
170+
iter: Fuse<I>,
171171
last: Option<T>,
172172
}
173173

174174
/// Create a new tuple windows iterator.
175-
pub fn tuple_windows<I, T>(mut iter: I) -> TupleWindows<I, T>
175+
pub fn tuple_windows<I, T>(iter: I) -> TupleWindows<I, T>
176176
where
177177
I: Iterator<Item = T::Item>,
178178
T: HomogeneousTuple,
179179
T::Item: Clone,
180180
{
181-
use std::iter::once;
182-
183-
let mut last = None;
184-
if T::num_items() != 1 {
185-
// put in a duplicate item in front of the tuple; this simplifies
186-
// .next() function.
187-
if let Some(item) = iter.next() {
188-
let iter = once(item.clone()).chain(once(item)).chain(&mut iter);
189-
last = T::collect_from_iter_no_buf(iter);
190-
}
181+
TupleWindows {
182+
last : None,
183+
iter : iter.fuse(),
191184
}
192-
193-
TupleWindows { iter, last }
194185
}
195186

196187
impl<I, T> Iterator for TupleWindows<I, T>
@@ -210,6 +201,13 @@ where
210201
last.left_shift_push(new);
211202
return Some(last.clone());
212203
}
204+
} else {
205+
use std::iter::once;
206+
if let Some(item) = self.iter.next() {
207+
let iter = once(item).chain(&mut self.iter);
208+
self.last = T::collect_from_iter_no_buf(iter);
209+
return self.last.clone();
210+
}
213211
}
214212
None
215213
}

0 commit comments

Comments
 (0)