1pub trait Tokenizer: Send + Sync {
9 fn count(&self, text: &str) -> usize;
11}
12
13#[derive(Debug, Default, Clone, Copy)]
16pub struct CharTokenizer;
17
18impl Tokenizer for CharTokenizer {
19 fn count(&self, text: &str) -> usize {
20 text.chars().count()
21 }
22}
23
24pub struct FnTokenizer<F: Fn(&str) -> usize + Send + Sync>(pub F);
26
27impl<F: Fn(&str) -> usize + Send + Sync> Tokenizer for FnTokenizer<F> {
28 fn count(&self, text: &str) -> usize {
29 (self.0)(text)
30 }
31}
32
33#[cfg(test)]
34mod tests {
35 use super::*;
36
37 #[test]
38 fn char_tokenizer_counts_chars() {
39 assert_eq!(CharTokenizer.count("hello"), 5);
40 }
41
42 #[test]
43 fn fn_tokenizer_invokes_closure() {
44 let t = FnTokenizer(|s: &str| s.split_whitespace().count());
45 assert_eq!(t.count("hello rust world"), 3);
46 }
47}