use std::borrow::Cow;
use unicode_normalization::UnicodeNormalization;
pub struct NormalizedString<'a>(Cow<'a, str>);
impl<'a> NormalizedString<'a> {
pub fn as_str(&self) -> &str {
&self.0
}
pub unsafe fn from_str(s: &'a str) -> NormalizedString<'a> {
NormalizedString(Cow::Borrowed(s))
}
}
pub trait Normalizable<'a> {
fn normalize(self, nfc: bool) -> NormalizedString<'a>;
}
impl<'a> Normalizable<'a> for &'a str {
fn normalize(self, nfc: bool) -> NormalizedString<'a> {
if nfc {
NormalizedString(self.nfc().collect())
} else {
NormalizedString(Cow::Borrowed(self))
}
}
}
impl<'a, T> Normalizable<'a> for &'a T
where
T: AsRef<str>,
{
fn normalize(self, nfc: bool) -> NormalizedString<'a> {
self.as_ref().normalize(nfc)
}
}
impl<'a> Normalizable<'a> for NormalizedString<'a> {
fn normalize(self, _: bool) -> NormalizedString<'a> {
self
}
}