use crate::core::{Expression, Number, Symbol};
pub fn is_just_variable(expr: &Expression, var: &Symbol) -> bool {
matches!(expr, Expression::Symbol(s) if *s == *var)
}
pub fn is_one(expr: &Expression) -> bool {
matches!(expr, Expression::Number(n) if n.is_one())
}
pub fn extract_division(expr: &Expression) -> Option<(Expression, Expression)> {
match expr {
Expression::Mul(factors) if factors.len() == 2 => {
if let Expression::Pow(base, exp) = &factors[1] {
if let Expression::Number(Number::Integer(-1)) = &**exp {
return Some((factors[0].clone(), (**base).clone()));
}
}
if let Expression::Pow(base, exp) = &factors[0] {
if let Expression::Number(Number::Integer(-1)) = &**exp {
return Some((factors[1].clone(), (**base).clone()));
}
}
None
}
Expression::Pow(base, exp) => {
if let Expression::Number(Number::Integer(-1)) = &**exp {
Some((Expression::integer(1), (**base).clone()))
} else {
None
}
}
_ => None,
}
}