1pub type IsMatching = bool;
2
3pub type Difference = Vec<(char, IsMatching)>;
4
5pub fn compare(source: &str, pattern: &str) -> Difference {
6 let mut pattern = pattern.chars();
7 let mut pattern_char = pattern.next();
8 let mut processed = Vec::new();
9 for source_char in source.chars() {
10 processed.push((source_char, if pattern_char == Some(source_char) {
11 pattern_char = pattern.next();
12 true
13 } else {
14 false
15 }));
16 }
17 processed
18}
19
20pub fn best<'a>(sources: impl Iterator<Item = &'a str>, pattern: &str) -> Vec<Difference> {
21 let mut matched = Vec::new();
22 for source in sources {
23 let difference = compare(source, pattern);
24 let count = difference.iter().filter(|(_char, is_match)| *is_match).count();
25 if count > 0 {
26 matched.push((count, difference));
27 }
28 }
29 matched.sort_by_key(|(count, _comparison)| std::cmp::Reverse(*count));
30 matched.into_iter().map(|(_count, difference)| difference).collect()
31}