Skip to content

Commit b535f28

Browse files
author
andrei-papou
committed
Made the formatting logic more modular
1 parent 49b4338 commit b535f28

File tree

1 file changed

+71
-66
lines changed

1 file changed

+71
-66
lines changed

src/arrayformat.rs

+71-66
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,42 @@ use crate::dimension::IntoDimension;
1717

1818
const PRINT_ELEMENTS_LIMIT: Ix = 3;
1919

20+
fn get_overflow_axes(shape: &[Ix], limit: usize) -> Vec<usize> {
21+
shape.iter()
22+
.enumerate()
23+
.rev()
24+
.filter(|(_, axis_size)| **axis_size > 2 * limit)
25+
.map(|(axis, _)| axis)
26+
.collect()
27+
}
28+
29+
fn get_highest_axis_to_skip(overflow_axes: &Vec<usize>,
30+
shape: &[Ix],
31+
index: &[Ix],
32+
limit: &usize) -> Option<usize> {
33+
overflow_axes.iter()
34+
.filter(|axis| {
35+
if **axis == shape.len() - 1 {
36+
return false
37+
};
38+
let sa_idx_max = shape.iter().skip(**axis).next().unwrap();
39+
let sa_idx_val = index.iter().skip(**axis).next().unwrap();
40+
sa_idx_val >= limit && sa_idx_val < &(sa_idx_max - limit)
41+
})
42+
.min()
43+
.map(|v| *v)
44+
}
45+
46+
fn get_highest_changed_axis(index: &[Ix], prev_index: &[Ix]) -> Option<usize> {
47+
index.iter()
48+
.take(index.len() - 1)
49+
.zip(prev_index.iter())
50+
.enumerate()
51+
.filter(|(_, (a, b))| a != b)
52+
.map(|(i, _)| i)
53+
.next()
54+
}
55+
2056
fn format_array<A, S, D, F>(view: &ArrayBase<S, D>,
2157
f: &mut fmt::Formatter,
2258
mut format: F,
@@ -30,12 +66,7 @@ fn format_array<A, S, D, F>(view: &ArrayBase<S, D>,
3066
return format(view.iter().next().unwrap(), f)
3167
}
3268

33-
let overflow_axes: Vec<Ix> = view.shape().iter()
34-
.enumerate()
35-
.rev()
36-
.filter(|(_, axis_size)| **axis_size > 2 * limit)
37-
.map(|(axis, _)| axis)
38-
.collect();
69+
let overflow_axes: Vec<Ix> = get_overflow_axes(view.shape(), limit);
3970

4071
let ndim = view.ndim();
4172
let nth_idx_max = view.shape()[ndim-1];
@@ -46,9 +77,6 @@ fn format_array<A, S, D, F>(view: &ArrayBase<S, D>,
4677
Some(ix) => ix,
4778
};
4879
write!(f, "{}", "[".repeat(ndim))?;
49-
let mut first = true;
50-
// Shows if ellipses for vertical split were printed.
51-
let mut printed_ellipses_v = false;
5280
// Shows if ellipses for horizontal split were printed.
5381
let mut printed_ellipses_h = vec![false; ndim];
5482
// Shows if the row was printed for the first time after horizontal split.
@@ -58,83 +86,60 @@ fn format_array<A, S, D, F>(view: &ArrayBase<S, D>,
5886
// as cues for when to add []'s and how many to add.
5987
for (index, elt) in view.indexed_iter() {
6088
let index = index.into_dimension();
61-
let mut update_index = false;
62-
63-
let skip_row_for_axis = overflow_axes.iter()
64-
.filter(|axis| {
65-
if **axis == ndim - 1 {
66-
return false
67-
};
68-
let sa_idx_max = view.shape().iter().skip(**axis).next().unwrap();
69-
let sa_idx_val = index.slice().iter().skip(**axis).next().unwrap();
70-
sa_idx_val >= &limit && sa_idx_val < &(sa_idx_max - &limit)
71-
})
72-
.min()
73-
.map(|v| *v);
74-
if let Some(_) = skip_row_for_axis {
89+
90+
let skip_row_for_axis = get_highest_axis_to_skip(
91+
&overflow_axes,
92+
view.shape(),
93+
index.slice(),
94+
&limit
95+
);
96+
if skip_row_for_axis.is_some() {
7597
no_rows_after_skip_yet = true;
7698
}
7799

78-
for (i, (a, b)) in index.slice()
79-
.iter()
80-
.take(ndim-1)
81-
.zip(last_index.slice().iter())
82-
.enumerate() {
83-
if a != b {
84-
printed_ellipses_h.iter_mut().skip(i + 1).for_each(|e| { *e = false; });
85-
86-
if skip_row_for_axis.is_none() {
87-
printed_ellipses_v = false;
88-
// New row.
89-
// # of ['s needed
90-
let n = ndim - i - 1;
91-
if !no_rows_after_skip_yet {
92-
write!(f, "{}", "]".repeat(n))?;
93-
writeln!(f, ",")?;
94-
}
95-
no_rows_after_skip_yet = false;
96-
write!(f, "{}", " ".repeat(ndim - n))?;
97-
write!(f, "{}", "[".repeat(n))?;
98-
} else if !printed_ellipses_h[skip_row_for_axis.unwrap()] {
99-
let ax = skip_row_for_axis.unwrap();
100-
let n = ndim - i - 1;
100+
let max_changed_idx = get_highest_changed_axis(index.slice(), last_index.slice());
101+
if let Some(i) = max_changed_idx {
102+
printed_ellipses_h.iter_mut().skip(i + 1).for_each(|e| { *e = false; });
103+
104+
if skip_row_for_axis.is_none() {
105+
// New row.
106+
// # of ['s needed
107+
let n = ndim - i - 1;
108+
if !no_rows_after_skip_yet {
101109
write!(f, "{}", "]".repeat(n))?;
102110
writeln!(f, ",")?;
103-
write!(f, "{}", " ".repeat(ax + 1))?;
104-
writeln!(f, "...,")?;
105-
printed_ellipses_h[ax] = true;
106111
}
107-
first = true;
108-
update_index = true;
109-
break;
112+
no_rows_after_skip_yet = false;
113+
write!(f, "{}", " ".repeat(ndim - n))?;
114+
write!(f, "{}", "[".repeat(n))?;
115+
} else if !printed_ellipses_h[skip_row_for_axis.unwrap()] {
116+
let ax = skip_row_for_axis.unwrap();
117+
let n = ndim - i - 1;
118+
write!(f, "{}", "]".repeat(n))?;
119+
writeln!(f, ",")?;
120+
write!(f, "{}", " ".repeat(ax + 1))?;
121+
writeln!(f, "...,")?;
122+
printed_ellipses_h[ax] = true;
110123
}
124+
last_index = index.clone();
111125
}
112126

113127
if skip_row_for_axis.is_none() {
114-
let mut print_elt = true;
115128
let nth_idx_op = index.slice().iter().last();
116129
if overflow_axes.contains(&(ndim - 1)) {
117130
let nth_idx_val = nth_idx_op.unwrap();
118131
if nth_idx_val >= &limit && nth_idx_val < &(nth_idx_max - &limit) {
119-
print_elt = false;
120-
if !printed_ellipses_v {
132+
if nth_idx_val == &limit {
121133
write!(f, ", ...")?;
122-
printed_ellipses_v = true;
123134
}
135+
continue;
124136
}
125137
}
126138

127-
if print_elt {
128-
if !first {
129-
write!(f, ", ")?;
130-
}
131-
first = false;
132-
format(elt, f)?;
139+
if max_changed_idx.is_none() && !index.slice().iter().all(|x| *x == 0) {
140+
write!(f, ", ")?;
133141
}
134-
}
135-
136-
if update_index {
137-
last_index = index;
142+
format(elt, f)?;
138143
}
139144
}
140145
write!(f, "{}", "]".repeat(ndim))?;

0 commit comments

Comments
 (0)