use std::collections::BTreeSet;
use chia_protocol::Bytes32;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SingletonLineage {
tip: Bytes32,
members: BTreeSet<Bytes32>,
}
impl SingletonLineage {
pub fn new(tip: Bytes32, members: impl IntoIterator<Item = Bytes32>) -> Self {
let mut members: BTreeSet<Bytes32> = members.into_iter().collect();
members.insert(tip);
Self { tip, members }
}
pub fn single(tip: Bytes32) -> Self {
Self::new(tip, [tip])
}
pub fn tip(&self) -> Bytes32 {
self.tip
}
pub fn contains(&self, coin_id: Bytes32) -> bool {
self.members.contains(&coin_id)
}
pub fn len(&self) -> usize {
self.members.len()
}
pub fn is_empty(&self) -> bool {
self.members.is_empty()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn lineage_membership_includes_tip_and_ancestors() {
let launcher = Bytes32::new([1u8; 32]);
let cn = Bytes32::new([2u8; 32]);
let tip = Bytes32::new([3u8; 32]);
let lineage = SingletonLineage::new(tip, [launcher, cn]);
assert!(lineage.contains(launcher));
assert!(lineage.contains(cn));
assert!(lineage.contains(tip));
assert!(!lineage.contains(Bytes32::new([9u8; 32])));
assert_eq!(lineage.tip(), tip);
assert_eq!(lineage.len(), 3);
assert!(!lineage.is_empty());
}
#[test]
fn single_lineage_is_tip_only() {
let tip = Bytes32::new([7u8; 32]);
let lineage = SingletonLineage::single(tip);
assert_eq!(lineage.len(), 1);
assert!(lineage.contains(tip));
}
}