rosu_pattern_detector/
utils.rs1use crate::mania::structs::SecondaryPattern;
2use std::collections::HashMap;
3
4pub fn max_values(patterns: &HashMap<SecondaryPattern, f64>) -> Vec<(SecondaryPattern, 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<SecondaryPattern, f64>) -> HashMap<SecondaryPattern, f64> {
29 let mut sums: HashMap<SecondaryPattern, 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<SecondaryPattern, f64>) -> Vec<(SecondaryPattern, 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}