1pub struct SkipIterator<I: Iterator> {
2 inner: I,
3}
4
5impl<I, T> Iterator for SkipIterator<I>
6where
7 I: Iterator<Item = T>,
8{
9 type Item = T;
10 fn next(&mut self) -> Option<Self::Item> {
11 self.inner.next()?;
12 self.inner.next()
13 }
14}
15
16pub trait IterCombi: Iterator + Sized {
17 fn skip_half(self) -> SkipIterator<Self> {
18 SkipIterator { inner: self }
19 }
20}
21
22impl<I: Iterator + Sized> IterCombi for I {}
23
24#[cfg(test)]
25mod test_skip {
26 use super::*;
27 #[test]
28 fn test_skip_half() {
29 let v: i32 = (0..10).skip_half().sum();
30 assert_eq!(v, 1 + 3 + 5 + 7 + 9);
31 }
32
33 #[test]
34 fn test_step_by() {
35 let v: i32 = (0..10).step_by(3).sum();
36 assert_eq!(v, 0 + 3 + 6 + 9);
37 }
38
39 use itertools::Itertools;
40 #[test]
41 fn test_interleave() {
42 let v: Vec<i32> = (0..4).interleave((11..=14).rev()).collect();
43 assert_eq!(v, vec![0, 14, 1, 13, 2, 12, 3, 11]);
44 }
45
46 #[test]
47 fn test_intersperse() {
48 let s = "hello world etc";
49 let v: Vec<&str> = s.split(" ").intersperse(",").collect();
50 assert_eq!(v, vec!["hello", ",", "world", ",", "etc"]);
51
52 let s2 = s.split(" ").join(",");
53 assert_eq!(s2, "hello,world,etc");
54 }
55}