use std::ops::Deref;
use crate::history::{HistoryGraph, HistoryId, HistoryNode};
use crate::precedence::PrecedencedRuleBuilder;
use crate::prelude::*;
use crate::rule::builder::RuleBuilder;
use crate::rule::GrammarRule;
use crate::symbol::source::SymbolContainer;
pub trait RuleContainer: Sized {
fn sym_source(&self) -> &SymbolSource;
fn sym_source_mut(&mut self) -> &mut SymbolSource;
fn sym<T>(&mut self) -> T
where
T: SymbolContainer,
{
self.sym_source_mut().sym()
}
fn next_sym(&mut self) -> Symbol {
self.sym_source_mut().next_sym()
}
fn num_syms(&self) -> usize {
self.sym_source().num_syms()
}
fn retain<F>(&mut self, f: F)
where
F: FnMut(Symbol, &[Symbol], HistoryId) -> bool;
fn add_rule(&mut self, lhs: Symbol, rhs: &[Symbol], history: HistoryId);
fn rule(&mut self, lhs: Symbol) -> RuleBuilder<&mut Self> {
RuleBuilder::new(self).rule(lhs)
}
fn precedenced_rule(&mut self, lhs: Symbol) -> PrecedencedRuleBuilder<&mut Self> {
PrecedencedRuleBuilder::new(self, lhs)
}
fn history_graph(&self) -> &HistoryGraph;
fn add_history_node(&mut self, node: HistoryNode) -> HistoryId;
}
impl<'a, D> RuleContainer for &'a mut D
where
D: RuleContainer,
{
fn sym_source(&self) -> &SymbolSource {
(**self).sym_source()
}
fn sym_source_mut(&mut self) -> &mut SymbolSource {
(**self).sym_source_mut()
}
fn retain<F>(&mut self, f: F)
where
F: FnMut(Symbol, &[Symbol], HistoryId) -> bool,
{
(**self).retain(f);
}
fn add_rule(&mut self, lhs: Symbol, rhs: &[Symbol], history: HistoryId) {
(**self).add_rule(lhs, rhs, history);
}
fn add_history_node(&mut self, node: HistoryNode) -> HistoryId {
(**self).add_history_node(node)
}
fn history_graph(&self) -> &HistoryGraph {
(**self).history_graph()
}
}
pub trait RuleContainerRef<'a>: Deref + Sized
where
Self::Target: RuleContainer + Default,
{
type RuleRef: GrammarRule + Copy + 'a;
type Rules: Iterator<Item = Self::RuleRef>;
fn rules(self) -> Self::Rules;
fn reverse(self) -> Self::Target
where
Self::Target: Default,
{
let mut new_grammar: Self::Target = Default::default();
for _ in 0..self.sym_source().num_syms() {
let _: Symbol = new_grammar.sym();
}
for node in self.history_graph().iter() {
new_grammar.add_history_node(node.clone());
}
for rule in self.rules() {
let mut rhs = rule.rhs().iter().cloned().collect::<Vec<_>>();
rhs.reverse();
new_grammar.add_rule(rule.lhs(), &rhs[..], rule.history_id());
}
new_grammar
}
}
pub trait RuleContainerMut<'a>: Deref
where
Self::Target: RuleContainer + Default + 'a,
&'a Self::Target: RuleContainerRef<'a, Target = Self::Target>,
{
}