Fix Skip::next for non-fused inner iterators

This commit is contained in:
Tim Vermeulen 2022-07-18 21:10:47 +02:00
parent 144227dae9
commit 50c612faef
2 changed files with 9 additions and 1 deletions

View File

@ -33,7 +33,7 @@ where
#[inline] #[inline]
fn next(&mut self) -> Option<I::Item> { fn next(&mut self) -> Option<I::Item> {
if unlikely(self.n > 0) { if unlikely(self.n > 0) {
self.iter.nth(crate::mem::take(&mut self.n) - 1); self.iter.nth(crate::mem::take(&mut self.n) - 1)?;
} }
self.iter.next() self.iter.next()
} }

View File

@ -1,5 +1,7 @@
use core::iter::*; use core::iter::*;
use super::Unfuse;
#[test] #[test]
fn test_iterator_skip() { fn test_iterator_skip() {
let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19, 20, 30]; let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19, 20, 30];
@ -190,3 +192,9 @@ fn test_skip_nth_back() {
it.by_ref().skip(2).nth_back(10); it.by_ref().skip(2).nth_back(10);
assert_eq!(it.next_back(), Some(&1)); assert_eq!(it.next_back(), Some(&1));
} }
#[test]
fn test_skip_non_fused() {
let non_fused = Unfuse::new(0..10);
let _ = non_fused.skip(20).next();
}