#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct AreaId(pub u64);
impl std::fmt::Display for AreaId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "AreaId({})", self.0)
}
}
pub type SplitRatio = f64;
#[derive(Debug, Clone, PartialEq)]
pub enum SplitNode {
Leaf {
id: AreaId,
},
Horizontal {
top: Box<SplitNode>,
bottom: Box<SplitNode>,
ratio: SplitRatio,
},
Vertical {
left: Box<SplitNode>,
right: Box<SplitNode>,
ratio: SplitRatio,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct SplitResult {
pub original: AreaId,
pub new: AreaId,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct CloseResult {
pub removed: AreaId,
pub surviving: AreaId,
}
impl SplitNode {
pub fn is_leaf(&self) -> bool {
matches!(self, Self::Leaf { .. })
}
pub fn leaf_id(&self) -> Option<AreaId> {
match self {
Self::Leaf { id } => Some(*id),
_ => None,
}
}
}