use vize_l0::String;
pub(super) fn has_text(value: &str) -> bool {
chars(value).next().is_some()
}
pub(super) fn normalized(value: &str) -> Option<String> {
if !value.contains(['\r', '\n', '\t']) {
return None;
}
Some(chars(value).collect())
}
fn chars(value: &str) -> impl Iterator<Item = char> + '_ {
let (last_line, last_non_empty) = if value.contains(['\r', '\n']) {
value
.split(['\r', '\n'])
.enumerate()
.fold((0, 0), |(_, last_non_empty), (index, line)| {
let last_non_empty = if line.contains(|character| !matches!(character, ' ' | '\t'))
{
index
} else {
last_non_empty
};
(index, last_non_empty)
})
} else {
(0, 0)
};
value
.split(['\r', '\n'])
.enumerate()
.flat_map(move |(index, line)| {
let line = if index == 0 {
line
} else {
line.trim_start_matches([' ', '\t'])
};
let line = if index == last_line {
line
} else {
line.trim_end_matches([' ', '\t'])
};
line.chars()
.map(|character| if character == '\t' { ' ' } else { character })
.chain((!line.is_empty() && index != last_non_empty).then_some(' '))
})
}