Skip to content

Commit 8cf7b7d

Browse files
committed
Fix tuple_windows as lazy
1 parent 6c4fc2f commit 8cf7b7d

File tree

1 file changed

+12
-17
lines changed

1 file changed

+12
-17
lines changed

src/tuple_impl.rs

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -139,31 +139,19 @@ pub struct TupleWindows<I, T>
139139
where I: Iterator<Item = T::Item>,
140140
T: HomogeneousTuple
141141
{
142-
iter: I,
142+
iter: Fuse<I>,
143143
last: Option<T>,
144144
}
145145

146146
/// 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>
148148
where I: Iterator<Item = T::Item>,
149149
T: HomogeneousTuple,
150150
T::Item: Clone
151151
{
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-
164152
TupleWindows {
165-
last,
166-
iter,
153+
last : None,
154+
iter : iter.fuse(),
167155
}
168156
}
169157

@@ -183,13 +171,20 @@ impl<I, T> Iterator for TupleWindows<I, T>
183171
last.left_shift_push(new);
184172
return Some(last.clone());
185173
}
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+
}
186181
}
187182
None
188183
}
189184
}
190185

191186
impl<I, T> FusedIterator for TupleWindows<I, T>
192-
where I: FusedIterator<Item = T::Item>,
187+
where I: Iterator<Item = T::Item>,
193188
T: HomogeneousTuple + Clone,
194189
T::Item: Clone
195190
{}

0 commit comments

Comments
 (0)