use crate::position::PositionInLanguageTerm;
use crate::term::syntax::{
LanguageTerm, LanguageTermNode, RewritableLanguageOperatorSymbol, TermFactory,
};
pub trait RewriteRule<LOS: RewritableLanguageOperatorSymbol> {
fn get_desc(&self) -> String;
fn try_apply(
&self,
term: &LanguageTerm<LOS>,
context_term: &LanguageTerm<LOS>,
position_in_context_term: &PositionInLanguageTerm,
factory: &mut TermFactory<LOS>,
) -> Option<LanguageTerm<LOS>>;
}
#[allow(clippy::type_complexity)]
pub struct ClosureRewriteRule<LOS: RewritableLanguageOperatorSymbol> {
desc: String,
apply: Box<
dyn Fn(
&LanguageTerm<LOS>,
&LanguageTerm<LOS>,
&PositionInLanguageTerm,
&mut TermFactory<LOS>,
) -> Option<LanguageTerm<LOS>>,
>,
}
impl<LOS: RewritableLanguageOperatorSymbol> ClosureRewriteRule<LOS> {
pub fn new<F>(desc: impl Into<String>, apply: F) -> Self
where
F: Fn(
&LanguageTerm<LOS>,
&LanguageTerm<LOS>,
&PositionInLanguageTerm,
&mut TermFactory<LOS>,
) -> Option<LanguageTerm<LOS>>
+ 'static,
{
Self {
desc: desc.into(),
apply: Box::new(apply),
}
}
}
impl<LOS: RewritableLanguageOperatorSymbol> RewriteRule<LOS> for ClosureRewriteRule<LOS> {
fn get_desc(&self) -> String {
self.desc.clone()
}
fn try_apply(
&self,
term: &LanguageTerm<LOS>,
context_term: &LanguageTerm<LOS>,
position_in_context_term: &PositionInLanguageTerm,
factory: &mut TermFactory<LOS>,
) -> Option<LanguageTerm<LOS>> {
(self.apply)(term, context_term, position_in_context_term, factory)
}
}
pub fn mk_leaf<LOS: RewritableLanguageOperatorSymbol>(
op: LOS,
factory: &mut TermFactory<LOS>,
) -> LanguageTerm<LOS> {
LanguageTermNode::build(op, vec![], factory)
}