use std::ops::{Deref, DerefMut};
use disposition_model_common::Map;
use serde::{Deserialize, Serialize};
use crate::node::NodeId;
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
#[derive(Clone, Debug, Default, PartialEq, Eq, Deserialize, Serialize)]
pub struct NodeHierarchy(Map<NodeId, NodeHierarchy>);
impl NodeHierarchy {
pub fn new() -> Self {
Self::default()
}
pub fn with_capacity(capacity: usize) -> Self {
Self(Map::with_capacity(capacity))
}
pub fn into_inner(self) -> Map<NodeId, NodeHierarchy> {
self.0
}
pub fn is_leaf(&self) -> bool {
self.0.is_empty()
}
pub fn children_count(&self) -> usize {
self.0.len()
}
pub fn total_descendants(&self) -> usize {
self.0
.values()
.map(|child| 1 + child.total_descendants())
.sum()
}
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
}
impl Deref for NodeHierarchy {
type Target = Map<NodeId, NodeHierarchy>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl DerefMut for NodeHierarchy {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}
impl From<Map<NodeId, NodeHierarchy>> for NodeHierarchy {
fn from(inner: Map<NodeId, NodeHierarchy>) -> Self {
Self(inner)
}
}
impl FromIterator<(NodeId, NodeHierarchy)> for NodeHierarchy {
fn from_iter<I: IntoIterator<Item = (NodeId, NodeHierarchy)>>(iter: I) -> Self {
Self(Map::from_iter(iter))
}
}