use crate::metis::{DotFun, DotMap, DotStore, Rhapsody};
use super::{Kind, KindPlurality, Kinds, Node};
#[derive(Clone, Copy, Debug)]
pub enum NodeContent<'a, K, V> {
Register(&'a DotFun<V>),
Map(&'a DotMap<K, Node<K, V>>),
Sequence(&'a Rhapsody),
}
impl<K: Ord + Clone, V: Clone> Node<K, V> {
#[must_use]
pub fn kinds_present(&self) -> Kinds {
let mut kinds = Kinds::new();
for kind in self.tag().values() {
kinds.insert(*kind);
}
if !self.register().is_empty() {
kinds.insert(Kind::Register);
}
if self.children().dots().next().is_some() {
kinds.insert(Kind::Map);
}
if self.sequence().dots().next().is_some() {
kinds.insert(Kind::Sequence);
}
kinds
}
pub fn sole(&self) -> Result<Option<NodeContent<'_, K, V>>, KindPlurality> {
let kinds = self.kinds_present();
match kinds.sole() {
Some(Kind::Register) => Ok(Some(NodeContent::Register(self.register()))),
Some(Kind::Map) => Ok(Some(NodeContent::Map(self.children()))),
Some(Kind::Sequence) => Ok(Some(NodeContent::Sequence(self.sequence()))),
None if kinds.is_empty() => Ok(None),
None => Err(KindPlurality { kinds }),
}
}
}