pub trait Tokenizer: Send + Sync {
fn count(&self, text: &str) -> usize;
}
#[derive(Debug, Default, Clone, Copy)]
pub struct CharTokenizer;
impl Tokenizer for CharTokenizer {
fn count(&self, text: &str) -> usize {
text.chars().count()
}
}
pub struct FnTokenizer<F: Fn(&str) -> usize + Send + Sync>(pub F);
impl<F: Fn(&str) -> usize + Send + Sync> Tokenizer for FnTokenizer<F> {
fn count(&self, text: &str) -> usize {
(self.0)(text)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn char_tokenizer_counts_chars() {
assert_eq!(CharTokenizer.count("hello"), 5);
}
#[test]
fn fn_tokenizer_invokes_closure() {
let t = FnTokenizer(|s: &str| s.split_whitespace().count());
assert_eq!(t.count("hello rust world"), 3);
}
}