pub(crate) type LineRangeFinder = fn(&[&str], &[&str]) -> LineMatch;
pub(crate) fn collect_all_ranges(
content_lines: &[&str],
old_lines: &[&str],
finder: LineRangeFinder,
) -> std::result::Result<Vec<(usize, usize)>, AtomwriteError> {
let mut hits = Vec::new();
if old_lines.is_empty() {
return Ok(hits);
}
let mut start_at = 0usize;
while start_at < content_lines.len() {
check_cancel()?;
if let Some((s, e)) = finder(&content_lines[start_at..], old_lines)? {
let abs_s = start_at + s;
let abs_e = start_at + e;
hits.push((abs_s, abs_e));
start_at = abs_e.max(start_at + 1);
} else {
break;
}
}
Ok(hits)
}