#[cfg(test)]
#[path = "store_tests.rs"]
mod store_tests;
use super::Region;
#[derive(Debug, Clone, Default)]
pub struct RegionStore {
regions: Vec<Region>,
}
impl RegionStore {
pub fn new() -> Self {
Self {
regions: Vec::new(),
}
}
pub fn from_regions(mut regions: Vec<Region>) -> Self {
regions.sort_by_key(|r| r.start_index);
Self { regions }
}
pub fn push(&mut self, region: Region) {
let pos = self
.regions
.partition_point(|r| r.start_index <= region.start_index);
self.regions.insert(pos, region);
}
pub fn regions_at(&self, index: usize) -> Vec<&Region> {
let upper = self.regions.partition_point(|r| r.start_index <= index);
self.regions[..upper]
.iter()
.filter(|r| r.end_index >= index)
.collect()
}
pub fn innermost_at(&self, index: usize) -> Option<&Region> {
self.regions_at(index)
.into_iter()
.min_by_key(|r| r.end_index - r.start_index)
}
pub fn regions(&self) -> &[Region] {
&self.regions
}
pub fn len(&self) -> usize {
self.regions.len()
}
pub fn is_empty(&self) -> bool {
self.regions.is_empty()
}
}