fuse_rust/
utils.rs

1use std::collections::HashMap;
2use std::ops::Range;
3
4pub fn calculate_score(pattern_length: usize, e: i32, x: i32, loc: i32, distance: i32) -> f64 {
5    let accuracy = (e as f64) / (pattern_length as f64);
6    let proximity = (x - loc).abs();
7    if distance == 0 {
8        return if proximity != 0 { 1. } else { accuracy };
9    }
10    accuracy + (proximity as f64) / (distance as f64)
11}
12
13/// Initializes the alphabet for the Bitap algorithm
14/// - Parameter pattern: The text to encode.
15/// - Returns: Hashmap of character locations.
16pub fn calculate_pattern_alphabet(pattern: &[u8]) -> HashMap<u8, u64> {
17    let len = pattern.len();
18    let mut mask = HashMap::new();
19    for (i, &c) in pattern.iter().enumerate() {
20        mask.insert(c, mask.get(&c).unwrap_or(&0) | (1 << (len - i - 1)));
21    }
22    mask
23}
24
25/// Returns an array of `Range<usize>`, where each range represents a consecutive list of `1`s.
26/// - Parameter mask: A string representing the value to search for.
27/// - Returns: `Vec<Range<usize>`.
28pub fn find_ranges(mask: &[u8]) -> Result<Vec<Range<usize>>, String> {
29    if mask.is_empty() {
30        return Err(String::from("Input array is empty"));
31    }
32    let mut ranges = vec![];
33    let mut start: i32 = -1;
34    for (n, bit) in mask.iter().enumerate() {
35        if start == -1 && *bit >= 1 {
36            start = n as i32;
37        } else if start != -1 && *bit == 0 {
38            ranges.push(start as usize..n);
39            start = -1;
40        }
41    }
42
43    if *mask.last().unwrap() == 1 {
44        ranges.push(start as usize..mask.len())
45    }
46    Ok(ranges)
47}