veho 0.0.20

a iterable toolset
Documentation
pub fn zipper<A, B, T, F>(a: A, b: B, mut f: F) -> Vec<T>
    where A: IntoIterator,
          B: IntoIterator,
          F: FnMut(A::Item, B::Item) -> T
{
    a.into_iter().zip(b)
        .map(|(a, b)| f(a, b))
        .collect::<Vec<T>>()
}

pub fn trizipper<A, B, C, T, F>(a: A, b: B, c: C, mut f: F) -> Vec<T>
    where A: IntoIterator,
          B: IntoIterator,
          C: IntoIterator,
          F: FnMut(A::Item, B::Item, C::Item) -> T
{
    a.into_iter().zip(b).zip(c)
        .map(|((a, b), c)| f(a, b, c))
        .collect::<Vec<T>>()
}

pub fn quazipper<A, B, C, D, T, F>(a: A, b: B, c: C, d: D, mut f: F) -> Vec<T>
    where A: IntoIterator,
          B: IntoIterator,
          C: IntoIterator,
          D: IntoIterator,
          F: FnMut(A::Item, B::Item, C::Item, D::Item) -> T
{
    a.into_iter().zip(b).zip(c).zip(d)
        .map(|(((a, b), c), d)| f(a, b, c, d))
        .collect::<Vec<T>>()
}

pub fn zipeach<A, B, F>(a: A, b: B, mut f: F)
    where A: IntoIterator,
          B: IntoIterator,
          F: FnMut(A::Item, B::Item)
{
    a.into_iter().zip(b)
        .for_each(|(a, b)| f(a, b))
}

pub fn trizipeach<A, B, C, F>(a: A, b: B, c: C, mut f: F)
    where A: IntoIterator,
          B: IntoIterator,
          C: IntoIterator,
          F: FnMut(A::Item, B::Item, C::Item)
{
    a.into_iter().zip(b).zip(c)
        .for_each(|((a, b), c)| f(a, b, c))
}

pub fn quazipeach<A, B, C, D, F>(a: A, b: B, c: C, d: D, mut f: F)
    where A: IntoIterator,
          B: IntoIterator,
          C: IntoIterator,
          D: IntoIterator,
          F: FnMut(A::Item, B::Item, C::Item, D::Item)
{
    a.into_iter().zip(b).zip(c).zip(d)
        .for_each(|(((a, b), c), d)| f(a, b, c, d))
}

#[cfg(test)]
mod tests {
    use crate::vector::{quazipper, trizipper, zipper};

    #[test]
    fn test_duo_zipper() {
        let a = vec![1, 2, 3];
        let b = vec![2, 4, 8];
        let v = zipper(&a, &b, |a, b| a * b);
        println!(">> a = {:?}", a);
        println!(">> b = {:?}", b);
        println!(">> v = {:?}", v);
    }

    #[test]
    fn test_mut_zipper() {
        let mut a = vec![1, 2, 3];
        let b = vec![2, 4, 8];
        let v = zipper(&mut a, &b, |a, b| {
            *a *= b;
            return *a;
        });
        println!(">> a = {:?}", a);
        println!(">> b = {:?}", b);
        println!(">> v = {:?}", v);
    }

    #[test]
    fn test_tri_zipper() {
        let mut a = vec![1, 2, 3];
        let b = vec![2, 4, 8];
        let c = vec![1, 10, 100];
        let v = trizipper(&mut a, &b, &c, |a, b, c| *a *= b * c);
        println!(">> a = {:?}", a);
        println!(">> b = {:?}", b);
        println!(">> c = {:?}", c);
        println!(">> v = {:?}", v);
    }

    #[test]
    fn test_qua_zipper() {
        let mut a = vec![0, 0, 0];
        let b = vec![5, 25, 125];
        let c = vec![1, 3, 7];
        let d = vec![1, 1, 1];
        let v = quazipper(&mut a, &b, &c, &d,
                          |xa, xb, xc, xd| *xa += xb * (xc + xd),
        );
        println!(">> a = {:?}", a);
        println!(">> v = {:?}", v);
    }
}