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
}