use serde::{Deserialize, Serialize};
use crate::error::Result;
use crate::normalized_string::NormalizedString;
use crate::normalizers::NormalizerWrapper;
use crate::pre_tokenizers::impl_unit_serde;
use crate::traits::Normalizer;
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct Sequence {
normalizers: Vec<NormalizerWrapper>,
}
impl Sequence {
pub fn new(normalizers: Vec<NormalizerWrapper>) -> Self {
Self { normalizers }
}
}
impl AsRef<[NormalizerWrapper]> for Sequence {
fn as_ref(&self) -> &[NormalizerWrapper] {
&self.normalizers
}
}
impl AsMut<[NormalizerWrapper]> for Sequence {
fn as_mut(&mut self) -> &mut [NormalizerWrapper] {
&mut self.normalizers
}
}
impl IntoIterator for Sequence {
type Item = NormalizerWrapper;
type IntoIter = std::vec::IntoIter<NormalizerWrapper>;
fn into_iter(self) -> Self::IntoIter {
self.normalizers.into_iter()
}
}
impl Normalizer for Sequence {
fn normalize(&self, normalized: &mut NormalizedString) -> Result<()> {
for n in &self.normalizers {
n.normalize(normalized)?;
}
Ok(())
}
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct Lowercase;
impl_unit_serde!(Lowercase);
impl Normalizer for Lowercase {
fn normalize(&self, normalized: &mut NormalizedString) -> Result<()> {
normalized.lowercase();
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::normalized_string::OffsetRange;
use crate::normalizers::{Prepend, Replace};
use crate::pattern::SplitPattern;
fn norm<N: Normalizer>(n: &N, s: &str) -> String {
let mut ns = NormalizedString::from(s);
n.normalize(&mut ns).unwrap();
ns.get().to_owned()
}
#[test]
fn lowercase_matches_hf() {
assert_eq!(norm(&Lowercase, "İa"), "i\u{307}a");
assert_eq!(norm(&Lowercase, "ΑΣ HELLO"), "ασ hello");
}
#[test]
fn llama_sequence_matches_hf() {
let seq = Sequence::new(vec![
Prepend::new("▁").into(),
Replace::new(SplitPattern::String(" ".into()), "▁")
.unwrap()
.into(),
]);
assert_eq!(norm(&seq, "Hey friend!"), "▁Hey▁friend!");
assert_eq!(norm(&seq, " x"), "▁▁x");
assert_eq!(norm(&seq, ""), "");
let mut ns = NormalizedString::from("Hey friend!");
seq.normalize(&mut ns).unwrap();
assert_eq!(
ns.convert_offsets(OffsetRange::Normalized(0..3)),
Some(0..1)
);
assert_eq!(
ns.get_range_original(OffsetRange::Normalized(6..15)),
Some(" friend")
);
}
}