use unicode_normalization::UnicodeNormalization;
use unicode_normalization::char::is_combining_mark;
pub(crate) fn normalize(text: &str) -> String {
let lowered = text.to_lowercase();
let stripped: String = lowered
.nfd()
.filter(|c| !is_combining_mark(*c))
.nfc()
.collect();
collapse_whitespace(&stripped)
}
fn collapse_whitespace(text: &str) -> String {
let mut out = String::with_capacity(text.len());
let mut pending_space = false;
for ch in text.chars() {
if ch.is_whitespace() {
pending_space = !out.is_empty();
} else {
if pending_space {
out.push(' ');
pending_space = false;
}
out.push(ch);
}
}
out
}