sim_lib_pitch_serial/
all_interval.rs1use crate::ToneRow;
4
5#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
7pub struct AllIntervalMultiplicity {
8 pub interval: u8,
10 pub count: u8,
12}
13
14#[derive(Clone, Debug, PartialEq, Eq, Default)]
16pub struct AllIntervalReport {
17 pub is_all_interval: bool,
19 pub duplicates: Vec<AllIntervalMultiplicity>,
21 pub missing: Vec<u8>,
23}
24
25pub fn analyze_all_interval(row: &ToneRow) -> AllIntervalReport {
27 let mut counts = [0u8; 12];
28 for interval in row.ordered_intervals().intervals() {
29 counts[usize::from(*interval)] += 1;
30 }
31 let duplicates = (1..12)
32 .filter_map(|interval| {
33 (counts[interval] > 1).then_some(AllIntervalMultiplicity {
34 interval: interval as u8,
35 count: counts[interval],
36 })
37 })
38 .collect::<Vec<_>>();
39 let missing = (1..12)
40 .filter_map(|interval| (counts[interval] == 0).then_some(interval as u8))
41 .collect::<Vec<_>>();
42 AllIntervalReport {
43 is_all_interval: duplicates.is_empty() && missing.is_empty(),
44 duplicates,
45 missing,
46 }
47}