#[derive(Debug, Default)]
pub(crate) struct NonterminalSets<'a> {
defined: crate::HashSet<&'a str>,
referenced: crate::HashSet<&'a str>,
}
impl<'a> NonterminalSets<'a> {
pub(crate) fn new() -> Self {
Self {
defined: crate::HashSet::new(),
referenced: crate::HashSet::new(),
}
}
pub(crate) fn record_lhs(&mut self, nt: &'a str) {
self.defined.insert(nt);
}
pub(crate) fn record_rhs(&mut self, nt: &'a str) {
self.referenced.insert(nt);
}
pub(crate) fn reserve(&mut self, defined: usize, referenced: usize) {
self.defined.reserve(defined);
self.referenced.reserve(referenced);
}
pub(crate) fn undefined(&self) -> impl Iterator<Item = &'a str> + '_ {
self.referenced.difference(&self.defined).copied()
}
}