///|
pub struct MergeCell {
range_ref : String
value : String
} derive(Debug)
///|
fn MergeCell::new(range_ref : String, value : String) -> MergeCell {
{ range_ref, value }
}
///|
pub fn MergeCell::get_cell_value(self : MergeCell) -> String {
self.value
}
///|
pub fn MergeCell::get_start_axis(self : MergeCell) -> String {
match self.range_ref.split_once(":") {
Some((start, _)) => start.to_owned()
None => self.range_ref
}
}
///|
pub fn MergeCell::get_end_axis(self : MergeCell) -> String {
match self.range_ref.split_once(":") {
Some((_, end)) => end.to_owned()
None => self.range_ref
}
}
///|
fn rects_overlap(a : (Int, Int, Int, Int), b : (Int, Int, Int, Int)) -> Bool {
let (a_min_row, a_min_col, a_max_row, a_max_col) = a
let (b_min_row, b_min_col, b_max_row, b_max_col) = b
!(a_max_row < b_min_row ||
a_min_row > b_max_row ||
a_max_col < b_min_col ||
a_min_col > b_max_col)
}
///|
fn rect_union(
a : (Int, Int, Int, Int),
b : (Int, Int, Int, Int),
) -> (Int, Int, Int, Int) {
let (a_min_row, a_min_col, a_max_row, a_max_col) = a
let (b_min_row, b_min_col, b_max_row, b_max_col) = b
(
if a_min_row < b_min_row {
a_min_row
} else {
b_min_row
},
if a_min_col < b_min_col {
a_min_col
} else {
b_min_col
},
if a_max_row > b_max_row {
a_max_row
} else {
b_max_row
},
if a_max_col > b_max_col {
a_max_col
} else {
b_max_col
},
)
}
///|
fn rect_to_range(rect : (Int, Int, Int, Int)) -> String raise XlsxError {
let (min_row, min_col, max_row, max_col) = rect
let start_ref = cell_ref_from(min_row, min_col)
let end_ref = cell_ref_from(max_row, max_col)
"\{start_ref}:\{end_ref}"
}
///|
fn merge_overlap_ranges(
ranges : ArrayView[String],
) -> Array[String] raise XlsxError {
let rects : Array[(Int, Int, Int, Int)] = []
for range_ref in ranges {
rects.push(parse_range_ref(range_ref))
}
let mut rect_list = rects
let mut merged = true
while merged {
merged = false
let used : Array[Bool] = Array::make(rect_list.length(), false)
let merged_rects : Array[(Int, Int, Int, Int)] = []
for i in 0.. fail("merge_overlap_ranges failed: \{repr(err)}")
}
inspect(merged.length(), content="2")
inspect(merged.contains("A1:C3"), content="true")
inspect(merged.contains("D1:E2"), content="true")
}