use serde::{Deserialize, Serialize};
pub trait Normalize {
fn normalize(&self, text: &mut String);
}
pub struct DefaultNormalizer;
impl DefaultNormalizer {
fn is_whitespace(&self, c: u8) -> bool {
c == b' ' || c == b'\t'
}
}
impl Normalize for DefaultNormalizer {
fn normalize(&self, text: &mut String) {
let mut prev = ' ';
text.retain(|x| {
let res = !self.is_whitespace(x as u8) || !self.is_whitespace(prev as u8);
prev = x;
res
});
}
}
#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
#[derive(Default)]
pub enum Normalizer {
#[default]
WhitespaceOnly,
}
impl Normalizer {
pub fn into_strategy(&self) -> Box<dyn Normalize + Send + Sync> {
match &self {
Normalizer::WhitespaceOnly => Box::new(DefaultNormalizer),
}
}
}