use crate::category::graph::{LevelEdge, LevelKind};
use comp_cat_rs::collapse::free_category::Vertex;
#[must_use]
pub const fn next_bundles(m: usize) -> usize {
(m / 3) * 2 + m % 3
}
#[must_use]
pub fn tree_level_edge(source_idx: usize, m: usize, w: usize) -> LevelEdge {
LevelEdge {
source: Vertex::new(source_idx),
target: Vertex::new(source_idx + 1),
kind: LevelKind::Csa { m, w },
}
}
#[cfg(test)]
mod tests {
use super::next_bundles;
#[test]
fn next_bundles_transitions() {
let table: [(usize, usize); 8] = [
(0, 0),
(1, 1),
(2, 2),
(3, 2),
(4, 3),
(5, 4),
(6, 4),
(9, 6),
];
table
.iter()
.for_each(|(m, want)| assert_eq!(next_bundles(*m), *want, "m={m}"));
}
#[test]
fn nine_reduces_to_two_in_four_steps() {
let steps = std::iter::successors(Some(9usize), |&b| match b {
0..=2 => None,
_ => Some(next_bundles(b)),
})
.collect::<Vec<_>>();
assert_eq!(steps, vec![9, 6, 4, 3, 2]);
}
}