rosu_pattern_detector/
utils.rs

1use crate::mania::models::pattern::Pattern;
2use std::collections::HashMap;
3
4pub fn max_values(patterns: &HashMap<Pattern, f64>) -> Vec<(Pattern, f64)> {
5    let mut result = Vec::new();
6    if patterns.is_empty() {
7        return result;
8    }
9
10    let mut sorted: Vec<_> = patterns.iter()
11        .map(|(k, v)| (k.clone(), *v))
12        .collect();
13    sorted.sort_by(|a, b| b.1.partial_cmp(&a.1).unwrap());
14
15    let max_value = sorted[0].1;
16
17    for (pattern, value) in sorted {
18        if value < max_value * 0.5 {
19            break;
20        }
21        result.push((pattern, value));
22    }
23
24    result
25}
26
27
28pub fn sum_by_secondary_type(patterns: &HashMap<Pattern, f64>) -> HashMap<Pattern, f64> {
29    let mut sums: HashMap<Pattern, f64> = HashMap::new();
30    for (pattern, &value) in patterns {
31        *sums.entry(pattern.to_all()).or_insert(0.0) += value;
32    }
33    sums
34}
35
36pub fn max_by_secondary_type(patterns: &HashMap<Pattern, f64>) -> Vec<(Pattern, f64)> {
37    let sums = sum_by_secondary_type(patterns);
38
39    let mut sorted: Vec<_> = sums.into_iter().collect();
40    sorted.sort_by(|a, b| b.1.partial_cmp(&a.1).unwrap());
41
42    if sorted.is_empty() {
43        return Vec::new();
44    }
45
46    let max_value = sorted[0].1;
47
48    sorted.into_iter()
49        .take_while(|(_, value)| *value >= max_value * 0.5)
50        .collect()
51}