use crate::topology::NodeId;
#[derive(Debug, Clone, Default, PartialEq)]
pub struct DrillPath {
pub segments: Vec<NodeId>,
}
impl DrillPath {
pub fn empty() -> Self {
Self::default()
}
pub fn at(&self, column_index: usize) -> Option<&NodeId> {
self.segments.get(column_index)
}
#[must_use]
pub fn select(&self, column_index: usize, id: NodeId) -> Self {
let mut new_segments = self.segments[..column_index.min(self.segments.len())].to_vec();
new_segments.push(id);
Self {
segments: new_segments,
}
}
#[must_use]
pub fn pop(&self) -> Self {
if self.segments.is_empty() {
return Self::empty();
}
Self {
segments: self.segments[..self.segments.len() - 1].to_vec(),
}
}
pub fn depth(&self) -> usize {
self.segments.len()
}
}