use crate::ToneRow;
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub struct AllIntervalMultiplicity {
pub interval: u8,
pub count: u8,
}
#[derive(Clone, Debug, PartialEq, Eq, Default)]
pub struct AllIntervalReport {
pub is_all_interval: bool,
pub duplicates: Vec<AllIntervalMultiplicity>,
pub missing: Vec<u8>,
}
pub fn analyze_all_interval(row: &ToneRow) -> AllIntervalReport {
let mut counts = [0u8; 12];
for interval in row.ordered_intervals().intervals() {
counts[usize::from(*interval)] += 1;
}
let duplicates = (1..12)
.filter_map(|interval| {
(counts[interval] > 1).then_some(AllIntervalMultiplicity {
interval: interval as u8,
count: counts[interval],
})
})
.collect::<Vec<_>>();
let missing = (1..12)
.filter_map(|interval| (counts[interval] == 0).then_some(interval as u8))
.collect::<Vec<_>>();
AllIntervalReport {
is_all_interval: duplicates.is_empty() && missing.is_empty(),
duplicates,
missing,
}
}