d2_iterators/
combi.rs

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}