use crate::position::PositionInLanguageTerm;
use crate::rule::RewriteRule;
use crate::rules::combinators::guard::RewriteApplicationGuard;
use crate::term::syntax::{LanguageTerm, RewritableLanguageOperatorSymbol, TermFactory};
pub struct GuardedRule<LOS: RewritableLanguageOperatorSymbol> {
inner: Box<dyn RewriteRule<LOS>>,
guard: Box<dyn RewriteApplicationGuard<LOS>>,
}
impl<LOS: RewritableLanguageOperatorSymbol> GuardedRule<LOS> {
pub fn new(
inner: impl RewriteRule<LOS> + 'static,
guard: impl RewriteApplicationGuard<LOS> + 'static,
) -> Self {
Self {
inner: Box::new(inner),
guard: Box::new(guard),
}
}
}
impl<LOS: RewritableLanguageOperatorSymbol> RewriteRule<LOS> for GuardedRule<LOS> {
fn get_desc(&self) -> String {
self.inner.get_desc()
}
fn try_apply(
&self,
term: &LanguageTerm<LOS>,
ctx: &LanguageTerm<LOS>,
pos: &PositionInLanguageTerm,
factory: &mut TermFactory<LOS>,
) -> Option<LanguageTerm<LOS>> {
if self.guard.allows(term, ctx, pos) {
self.inner.try_apply(term, ctx, pos, factory)
} else {
None
}
}
}