link_cli/sequences/
balanced_variant_converter.rs1use crate::link_storage::LinkStorage;
2
3#[derive(Clone, Copy, Debug, Default)]
4pub struct BalancedVariantConverter;
5
6impl BalancedVariantConverter {
7 pub fn new() -> Self {
8 Self
9 }
10
11 pub fn convert(&self, links: &mut LinkStorage, elements: &[u32]) -> u32 {
12 match elements.len() {
13 0 => 0,
14 1 => elements[0],
15 2 => links.get_or_create(elements[0], elements[1]),
16 _ => {
17 let mut layer = elements.to_vec();
18 while layer.len() > 2 {
19 let mut next = Vec::with_capacity(layer.len().div_ceil(2));
20 let mut chunks = layer.chunks_exact(2);
21 for pair in &mut chunks {
22 next.push(links.get_or_create(pair[0], pair[1]));
23 }
24 if let Some(&remainder) = chunks.remainder().first() {
25 next.push(remainder);
26 }
27 layer = next;
28 }
29 links.get_or_create(layer[0], layer[1])
30 }
31 }
32 }
33}