use serde::Deserialize;
use serde::Serialize;
use crate::id::Id;
#[derive(Debug, Clone, PartialEq, Eq)]
#[derive(Serialize, Deserialize, Ord, PartialOrd)]
pub struct FlatSegment {
pub low: Id,
pub high: Id,
pub parents: Vec<Id>,
}
#[cfg(any(test, feature = "for-tests"))]
impl quickcheck::Arbitrary for FlatSegment {
fn arbitrary(g: &mut quickcheck::Gen) -> Self {
Self {
low: Id::arbitrary(g),
high: Id::arbitrary(g),
parents: Vec::arbitrary(g),
}
}
}
use std::collections::BTreeSet;
#[derive(Clone, Debug, Default, PartialEq, Eq)]
#[derive(Serialize, Deserialize)]
pub struct PreparedFlatSegments {
pub segments: BTreeSet<FlatSegment>,
}
impl PreparedFlatSegments {
pub fn vertex_count(&self) -> u64 {
let mut count = 0;
for segment in &self.segments {
count += segment.high.0 - segment.low.0 + 1;
}
count
}
pub fn segment_count(&self) -> usize {
self.segments.len()
}
pub fn parents_head_and_roots(&self) -> BTreeSet<Id> {
self.segments
.iter()
.flat_map(|seg| {
[seg.high, seg.low].into_iter().chain(seg.parents.clone())
})
.collect()
}
}