use super::Particle;

fn unpack(hash: hemera::Hash) -> Particle {
    std::array::from_fn(|i| {
        let mut bytes = [0; 8];
        bytes.copy_from_slice(&hash.as_bytes()[i * 8..i * 8 + 8]);
        nebu::Goldilocks::new(u64::from_le_bytes(bytes)).as_u64()
    })
}

fn pack(particle: Particle) -> hemera::Hash {
    let mut bytes = [0; 32];
    for (i, limb) in particle.into_iter().enumerate() {
        bytes[i * 8..i * 8 + 8].copy_from_slice(&limb.to_le_bytes());
    }
    hemera::Hash::from_bytes(bytes)
}

pub(super) fn atom(value: u64) -> Particle {
    unpack(hemera::tree::hash_leaf(&value.to_le_bytes(), 0, false))
}

pub(super) fn pair(left: Particle, right: Particle) -> Particle {
    unpack(hemera::tree::hash_node(&pack(left), &pack(right), false))
}

Homonyms

cyb/shell/src/worlds/identity.rs
soft3/neuron/model/tests/identity.rs
soft3/neuron/model/src/identity.rs

Graph