tallyweb_fuzzy_sort/
simple.rs1use super::*;
2
3pub struct SimpleMatch {
4 pattern: String,
5}
6
7impl SimpleMatch {
8 pub fn new(pattern: impl ToString) -> Self {
9 Self {
10 pattern: pattern.to_string(),
11 }
12 }
13
14 pub fn set(&mut self, pattern: impl ToString) {
15 self.pattern = pattern.to_string()
16 }
17}
18
19impl<'a> FuzzySort<'a> for SimpleMatch {
20 fn score(&self, a: &'a str) -> u32 {
21 let mut idx = 0;
22 let mut score = 0;
23 for (pat_idx, char) in self.pattern.chars().enumerate() {
24 if let Some(i) = a[idx..].find(char) {
25 score += 2 + (i == 0) as u32 * 2 + (pat_idx == 0) as u32 * 2;
26 idx += i + 1;
27 } else if let Some(i) = a[idx..].to_lowercase().find(char.to_ascii_lowercase()) {
28 score += 1 + (i == 0) as u32 * 2 + (pat_idx == 0) as u32 * 2;
29 idx += i + 1;
30 }
31 println!("char={char}, score={score}")
32 }
33
34 score
35 }
36
37 fn sort<T: Sortable + 'static>(&self) -> impl FnMut(&T, &T) -> std::cmp::Ordering {
38 return move |a: &T, b: &T| self.score(b.as_str()).cmp(&self.score(a.as_str()));
39 }
40}
41
42#[cfg(test)]
43mod tests {
44 use super::*;
45
46 #[test]
47 fn test_simple_score() {
48 let sorter = SimpleMatch::new("foo");
49 assert_eq!(sorter.score("bar"), 0);
50 assert_eq!(sorter.score("faa"), 6);
51 assert_eq!(sorter.score("afa"), 4);
52 assert_eq!(sorter.score("faf"), 6);
53 assert_eq!(sorter.score("ko"), 2);
54 }
55}