use crate::core::terms::{position::PositionInLanguageTerm, term::{LanguageTerm, RewritableLanguageOperatorSymbol}};
pub trait GenericBinaryOperatorSimplifier<LOS : RewritableLanguageOperatorSymbol> {
fn is_binary(&self, op : &LOS) -> bool;
fn try_simplify_under_binary_operator(
&self,
top_operator : &LOS,
left : &LanguageTerm<LOS>,
right : &LanguageTerm<LOS>,
) -> Option<LanguageTerm<LOS>>;
}
pub(crate) fn transformation_generic_simpl_under_binary_operator<
LOS : RewritableLanguageOperatorSymbol
>(
checker : &Box<dyn GenericBinaryOperatorSimplifier<LOS>>,
term : &LanguageTerm<LOS>,
_context_term : &LanguageTerm<LOS>,
_position_in_context_term : &PositionInLanguageTerm
) -> Option<LanguageTerm<LOS>> {
let operator_at_root = &term.operator;
let precondition = checker.is_binary(operator_at_root);
if precondition {
let left_sub_term = term.sub_terms.first().unwrap();
let right_sub_term = term.sub_terms.get(1).unwrap();
checker.try_simplify_under_binary_operator(
operator_at_root,
left_sub_term,
right_sub_term)
} else {
None
}
}