pub struct SkipIterator<I: Iterator> {
inner: I,
}
impl<I, T> Iterator for SkipIterator<I>
where I: Iterator<Item = T> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
self.inner.next()?;
self.inner.next()
}
}
pub trait IterCombi: Iterator + Sized {
fn skip_half(self) -> SkipIterator<Self> {
SkipIterator { inner: self }
}
}
impl<I: Iterator + Sized> IterCombi for I {}
#[cfg(test)]
mod combi_tests {
use super::*;
use itertools::Itertools;
#[test]
fn it_works() {
assert_eq!(2 + 2, 4);
}
#[test]
fn skip_iter_test() {
let my_iter = (2..13).step_by(2);
let skip_iter = my_iter.skip_half();
let mut sum = 0;
for s in skip_iter {
println!("s, sum = {}, {}", s, sum);
sum += s;
}
assert_eq!(sum, 24, "Test 1");
}
#[test]
fn skip_iter_2() {
let skip_sum: i32 = (2..13).step_by(2).skip_half().sum();
assert_eq!(skip_sum, 24, "Test 1");
}
#[test]
fn test_step_by() {
let v: i32 = (0..10).step_by(3).sum();
assert_eq!(v, 0 + 3 + 6 + 9);
}
#[test]
fn test_interleave() {
let v:Vec<i32> = (0..4).interleave((10..14).rev()).collect();
assert_eq!(v, vec![0, 13, 1, 12, 2, 11, 3, 10]);
}
#[test]
fn test_intersperse() {
let s = "hello world etc";
let v : Vec<&str> = s.split(" ").intersperse(",").collect();
assert_eq!(v, vec!["hello",",","world",",","etc"]);
let s2 = s.split(" ").join(",");
assert_eq!(s2, "hello,world,etc");
}
}