sim_lib_pitch_serial/
vertical.rs1use sim_lib_pitch_core::PitchClass;
4use sim_lib_pitch_set::PitchClassMask;
5
6use crate::{
7 AggregateCoverageReport, BlockOrder, RowPartition, ToneRow,
8 analyze_partition_aggregate_coverage,
9};
10
11#[derive(Clone, Debug, PartialEq, Eq)]
13pub struct VerticalSlice {
14 pub block_index: usize,
16 pub ordinals: Vec<u8>,
18 pub pitch_classes: Vec<PitchClass>,
20 pub mask: PitchClassMask,
22}
23
24#[derive(Clone, Debug, PartialEq, Eq)]
26pub struct VerticalCollection {
27 pub order: BlockOrder,
29 pub slices: Vec<VerticalSlice>,
31 pub aggregate_coverage: AggregateCoverageReport,
33}
34
35pub fn verticalize(row: &ToneRow, partition: &RowPartition) -> VerticalCollection {
37 let slices = partition
38 .blocks()
39 .iter()
40 .enumerate()
41 .map(|(block_index, block)| {
42 let pitch_classes = block.pitch_classes(row);
43 VerticalSlice {
44 block_index,
45 ordinals: block.ordinals().to_vec(),
46 mask: PitchClassMask::from_pitch_classes(&pitch_classes),
47 pitch_classes,
48 }
49 })
50 .collect();
51 VerticalCollection {
52 order: partition.order(),
53 slices,
54 aggregate_coverage: analyze_partition_aggregate_coverage(row, partition),
55 }
56}