dumbfuzz/
lib.rs

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}