use sim_lib_pitch_core::PitchClass;
use sim_lib_pitch_set::PitchClassMask;
use crate::{
AggregateCoverageReport, BlockOrder, RowPartition, ToneRow,
analyze_partition_aggregate_coverage,
};
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct VerticalSlice {
pub block_index: usize,
pub ordinals: Vec<u8>,
pub pitch_classes: Vec<PitchClass>,
pub mask: PitchClassMask,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct VerticalCollection {
pub order: BlockOrder,
pub slices: Vec<VerticalSlice>,
pub aggregate_coverage: AggregateCoverageReport,
}
pub fn verticalize(row: &ToneRow, partition: &RowPartition) -> VerticalCollection {
let slices = partition
.blocks()
.iter()
.enumerate()
.map(|(block_index, block)| {
let pitch_classes = block.pitch_classes(row);
VerticalSlice {
block_index,
ordinals: block.ordinals().to_vec(),
mask: PitchClassMask::from_pitch_classes(&pitch_classes),
pitch_classes,
}
})
.collect();
VerticalCollection {
order: partition.order(),
slices,
aggregate_coverage: analyze_partition_aggregate_coverage(row, partition),
}
}