pub(crate) fn for_each_line(content: &[u8], mut f: impl FnMut(u32, usize, &[u8])) {
if content.is_empty() {
return;
}
let mut line_num: u32 = 1;
let mut line_start: usize = 0;
for i in 0..=content.len() {
let is_end = i == content.len();
let is_newline = !is_end && content[i] == b'\n';
if is_newline || is_end {
if is_end && line_start == content.len() {
break;
}
let line_end = if is_newline && i > line_start && content[i - 1] == b'\r' {
i - 1
} else {
i
};
f(line_num, line_start, &content[line_start..line_end]);
line_num += 1;
line_start = i + 1;
}
}
}