use common_range_tools::{Columns, DefaultValues, GetBeginEnd, NumberIncDecCpCmp, sort_forward};
fn main() {
let mut col_a = vec![0..=11, 2..=3, 7..=9, 22..=33, 34..=39];
let mut col_b = vec![6..=9, 6..=9, 6..=7, 11..=22, 7..=11, 9..=9];
let mut col_c = vec![3..=4, 3..=9, 4..=6, 30..=41];
let t = NumberIncDecCpCmp::defaults();
let sort_by = |a: &std::ops::RangeInclusive<i32>, b: &std::ops::RangeInclusive<i32>| {
sort_forward(a, b, &t.default_rebound(), &t)
};
col_a.sort_by(sort_by);
col_b.sort_by(sort_by);
col_c.sort_by(sort_by);
let cols = Columns::num_defaults();
assert!(cols.add_column(col_a.into_iter()).is_ok());
assert!(cols.add_column(col_b.into_iter()).is_ok());
assert!(cols.add_column(col_c.into_iter()).is_ok());
println!(
"+---------+-----------+{:-<35}+{:-<61}+{:-<35}+",
"", "", ""
);
println!(
"| Overlap | State(id) |{:^35}|{:^61}|{:^35}|",
"Column(A)", "Column(B)", "Column(C)"
);
let mut iter = cols.into_iter();
let mut id = 0;
loop {
let next = iter.next();
if next.is_none() {
println!(
"+---------+-----------+{:-<35}+{:-<61}+{:-<35}+",
"", "", ""
);
return;
}
let (overlap, res, columns) = next.unwrap();
println!(
"+---------+-----------+{:-<35}+{:-<61}+{:-<35}+",
"", "", ""
);
print!("| {:^2}->{:^2} |", overlap.get_begin(), overlap.get_end());
let mut stop = false;
if res.is_err() {
print!(" Err({}) |", id);
stop = true;
} else {
print!(" Ok({}) |", id);
}
for (column_id, col) in columns.iter().enumerate() {
let mut txt = Vec::new();
match col {
Ok(src) => {
for row in src {
let container = row.as_ref();
txt.push(format!(
"[{}->{}](",
container.get_begin(),
container.get_end()
));
let mut r = Vec::new();
for (row_id, range) in container.src().iter() {
r.push(format!("{}({}->{})", row_id, range.start(), range.end()));
}
txt.push(r.join(","));
txt.push(String::from(")"));
}
}
Err(msg) => {
txt.push(String::from(*msg));
let col = iter.get_column(column_id).unwrap();
let rows = col.get_rows();
for row in rows {
let result_range = row.as_ref();
txt.push(format!(
"Invalid Range: ({}->{})",
result_range.get_begin(),
result_range.get_end()
));
for (row_id, range) in result_range.src().iter() {
txt.push(format!("({}){}->{}", row_id, range.start(), range.end()))
}
}
}
}
match column_id {
0 => print!("{:^35}|", txt.join("")),
1 => print!("{:^61}|", txt.join("")),
2 => print!("{:^35}|", txt.join("")),
_ => (),
}
}
println!();
if stop {
break;
}
id += 1;
}
}