use crate::core::terms::{position::PositionInLanguageTerm, term::{LanguageTerm, RewritableLanguageOperatorSymbol}};
pub trait AssociativityChecker<LOS : RewritableLanguageOperatorSymbol> {
fn is_binary_associative(&self, op : &LOS) -> bool;
}
pub(crate) fn transformation_flush_to_the_right<
LOS : RewritableLanguageOperatorSymbol
>(
checker : &Box<dyn AssociativityChecker<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_associative(operator_at_root);
if precondition {
let t1 = term.sub_terms.first().unwrap();
if &t1.operator == operator_at_root {
let t2 = term.sub_terms.get(1).unwrap();
let t11 = t1.sub_terms.first().unwrap();
let t12 = t1.sub_terms.get(1).unwrap();
let new_right_sub_term = LanguageTerm::new(
operator_at_root.clone(),
vec![
t12.clone(),
t2.clone()
]
);
let new_term = LanguageTerm::new(
operator_at_root.clone(),
vec![
t11.clone(),
new_right_sub_term
]
);
Some(new_term)
} else {
None
}
} else {
None
}
}
pub(crate) fn transformation_flush_to_the_left<
LOS : RewritableLanguageOperatorSymbol
>(
checker : &Box<dyn AssociativityChecker<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_associative(operator_at_root);
if precondition {
let t2 = term.sub_terms.get(1).unwrap();
if &t2.operator == operator_at_root {
let t1 = term.sub_terms.first().unwrap();
let t21 = t2.sub_terms.first().unwrap();
let t22 = t2.sub_terms.get(1).unwrap();
let new_left_sub_term = LanguageTerm::new(
operator_at_root.clone(),
vec![
t1.clone(),
t21.clone()
]
);
let new_term = LanguageTerm::new(
operator_at_root.clone(),
vec![
new_left_sub_term,
t22.clone()
]
);
Some(new_term)
} else {
None
}
} else {
None
}
}