use indexmap::IndexSet;
use leo_span::Symbol;
use std::{fmt::Debug, hash::Hash};
pub type ConditionalTreeNode = TreeNode<Symbol>;
pub trait Node: Copy + 'static + Eq + PartialEq + Debug + Hash {}
impl Node for Symbol {}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TreeNode<N: Node> {
pub depth: usize,
pub elements: IndexSet<N>, pub counter: usize,
}
impl<N: Node> TreeNode<N> {
pub fn new(elements: IndexSet<N>) -> Self {
Self { depth: 0, elements, counter: 0 }
}
pub fn create_child(&self) -> TreeNode<N> {
Self { depth: self.depth + 1, elements: self.elements.clone(), counter: self.counter }
}
pub fn remove_element(&mut self, element: &N) -> bool {
let is_not_first = match self.elements.first() {
Some(first) => first != element,
None => false,
};
if !self.elements.shift_remove(element) {
self.counter += 1;
false
} else {
is_not_first
}
}
}