| 62 | } |
| 63 | |
| 64 | pub fn transpose<T>(v: Vec<Vec<T>>) -> Vec<Vec<T>> { |
| 65 | if v.is_empty() || v[0].is_empty() { |
| 66 | return v; |
| 67 | } |
| 68 | |
| 69 | let columns = v.len(); |
| 70 | let height = v[0].len(); |
| 71 | |
| 72 | let mut optional_v: Vec<Vec<Option<T>>> = v |
| 73 | .into_iter() |
| 74 | .map(|cell_v| cell_v.into_iter().map(Some).collect()) |
| 75 | .collect(); |
| 76 | |
| 77 | let mut transpose = Vec::with_capacity(height); |
| 78 | |
| 79 | for i in 0..height { |
| 80 | let mut row_buffer = Vec::with_capacity(columns); |
| 81 | |
| 82 | for inner_v in optional_v.iter_mut().take(columns) { |
| 83 | row_buffer.push(std::mem::take(&mut inner_v[i]).unwrap()); |
| 84 | } |
| 85 | |
| 86 | transpose.push(row_buffer); |
| 87 | } |
| 88 | |
| 89 | transpose |
| 90 | } |
| 91 | |
| 92 | pub(crate) fn print_horizontal_line( |
| 93 | buffers: &mut Buffers<'_>, |