arcium-primitives 0.4.1

Arcium primitives
Documentation
pub fn transpose<Outer, Inner, T>(matrix: Outer) -> Vec<Vec<T>>
where
    Outer: IntoIterator<Item = Inner>,
    Inner: IntoIterator<Item = T>,
{
    let mut row_iters: Vec<_> = matrix.into_iter().map(|row| row.into_iter()).collect();

    if row_iters.is_empty() {
        return vec![];
    }

    let mut result = Vec::new();

    loop {
        let mut column: Vec<T> = Vec::new();
        let mut has_elements = false;

        for row_iter in row_iters.iter_mut() {
            if let Some(element) = row_iter.next() {
                column.push(element);
                has_elements = true;
            }
        }

        if !has_elements {
            break;
        }

        result.push(column);
    }

    result
}