veho 0.0.20

a iterable toolset
Documentation
use crate::matrix::Utils;
use crate::vector::mapper as mapper_vector;

pub trait Mappers<R>: IntoIterator<Item=R>
    where R: IntoIterator
{
    fn map_columns<P, F>(self, mut fn_on_column: F) -> Vec<P> where
        Self: Sized,
        R::IntoIter: ExactSizeIterator<Item=R::Item>,
        F: FnMut(Vec<R::Item>) -> P
    { mapper_vector(self.transpose(), |col| fn_on_column(col)) }
}

impl<R, M> Mappers<R> for M where
    M: IntoIterator<Item=R>,
    R: IntoIterator
{}

pub fn map_columns<R, M, F, P>(matrix: M, f: F) -> Vec<P> where
    M: IntoIterator<Item=R>,
    R: IntoIterator,
    R::IntoIter: ExactSizeIterator<Item=R::Item>,
    F: FnMut(Vec<R::Item>) -> P
{ matrix.map_columns(f) }

#[deprecated(since = "0.0.20", note = "please use `map_columns` instead")]
pub fn mapper<R, M, F, P>(matrix: M, f: F) -> Vec<P> where
    M: IntoIterator<Item=R>,
    R: IntoIterator,
    R::IntoIter: ExactSizeIterator<Item=R::Item>,
    F: FnMut(Vec<R::Item>) -> P
{ matrix.map_columns(f) }

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test() {
        let matrix = vec![vec![1, 2, 3], vec![1, 2, 3], vec![1, 2, 3]];
        let result = (&matrix).map_columns(|col| mapper_vector(col, |x| { x + 1 }));
        println!(">> result = {:?}", result);
        println!(">> matrix = {:?}", matrix);
    }
}