use crate::grammar::{GrammarFsm, GrammarState};
use crate::envelope::AdmissibilityEnvelope;
use crate::sign::ResidualSign;
pub struct GrammarFusion {
fsm1: GrammarFsm,
fsm2: GrammarFsm,
}
impl GrammarFusion {
pub fn new() -> Self {
Self { fsm1: GrammarFsm::new(), fsm2: GrammarFsm::new() }
}
pub fn step(
&mut self,
sign1: &ResidualSign, env1: &AdmissibilityEnvelope,
sign2: &ResidualSign, env2: &AdmissibilityEnvelope,
) -> (GrammarState, GrammarState) {
let g1 = self.fsm1.step(sign1, env1);
let g2 = self.fsm2.step(sign2, env2);
(g1, g2)
}
pub fn is_joint_violation(&self) -> bool {
self.fsm1.state().is_violation() || self.fsm2.state().is_violation()
}
}
impl Default for GrammarFusion {
fn default() -> Self { Self::new() }
}