use std::fmt::Debug;
use std::iter::ExactSizeIterator;
use crate::{Id, Language};
#[non_exhaustive]
#[derive(Debug, Clone)]
pub struct EClass<L, D> {
pub id: Id,
pub nodes: Vec<L>,
pub data: D,
pub(crate) parents: Vec<(L, Id)>,
}
impl<L, D> EClass<L, D> {
pub fn is_empty(&self) -> bool {
self.nodes.is_empty()
}
pub fn len(&self) -> usize {
self.nodes.len()
}
pub fn iter(&self) -> impl ExactSizeIterator<Item = &L> {
self.nodes.iter()
}
}
impl<L: Language, D> EClass<L, D> {
pub fn leaves(&self) -> impl Iterator<Item = &L> {
self.nodes.iter().filter(|&n| n.is_leaf())
}
pub fn assert_unique_leaves(&self)
where
L: Language,
{
let mut leaves = self.leaves();
if let Some(first) = leaves.next() {
assert!(
leaves.all(|l| l == first),
"Different leaves in eclass {}: {:?}",
self.id,
self.leaves().collect::<indexmap::IndexSet<_>>()
);
}
}
}