Skip to main content

link_cli/sequences/
balanced_variant_converter.rs

1use 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}