Skip to main content

tallyweb_fuzzy_sort/
simple.rs

1use 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}