rosu-pattern-detector 0.2.1

Pattern detector for osu!
Documentation
use crate::mania::models::pattern::Pattern;
use std::collections::HashMap;

pub fn max_values(patterns: &HashMap<Pattern, f64>) -> Vec<(Pattern, f64)> {
    let mut result = Vec::new();
    if patterns.is_empty() {
        return result;
    }

    let mut sorted: Vec<_> = patterns.iter()
        .map(|(k, v)| (k.clone(), *v))
        .collect();
    sorted.sort_by(|a, b| b.1.partial_cmp(&a.1).unwrap());

    let max_value = sorted[0].1;

    for (pattern, value) in sorted {
        if value < max_value * 0.5 {
            break;
        }
        result.push((pattern, value));
    }

    result
}


pub fn sum_by_secondary_type(patterns: &HashMap<Pattern, f64>) -> HashMap<Pattern, f64> {
    let mut sums: HashMap<Pattern, f64> = HashMap::new();
    for (pattern, &value) in patterns {
        *sums.entry(pattern.to_all()).or_insert(0.0) += value;
    }
    sums
}

pub fn max_by_secondary_type(patterns: &HashMap<Pattern, f64>) -> Vec<(Pattern, f64)> {
    let sums = sum_by_secondary_type(patterns);

    let mut sorted: Vec<_> = sums.into_iter().collect();
    sorted.sort_by(|a, b| b.1.partial_cmp(&a.1).unwrap());

    if sorted.is_empty() {
        return Vec::new();
    }

    let max_value = sorted[0].1;

    sorted.into_iter()
        .take_while(|(_, value)| *value >= max_value * 0.5)
        .collect()
}