ihateintegrals 0.1.2

A computer algebra library for solving integrals.
Documentation
use std::rc::Rc;

use crate::{
    argument::Argument,
    expressions::{Expression, Integer},
};

use super::DerivationRule;

pub struct ExponentToZero {}

impl DerivationRule for ExponentToZero {
    fn apply(&self, input: Expression) -> Vec<(Expression, Rc<Argument>)> {
        let exponent = match input {
            Expression::Exponent(ref e) => e,
            _ => return vec![],
        };

        if let Expression::Integer(i) = exponent.power() {
            if i.value() != 0 {
                return vec![];
            }
        } else {
            return vec![];
        }

        vec![(
            Integer::of(1),
            Argument::new(String::from("Anything to 0 is 1"), vec![input], self.name()),
        )]
    }
    fn name(&self) -> String {
        String::from("ExponentToZero")
    }
}

#[cfg(test)]
mod tests {
    use crate::convenience_expressions::{i, power};

    use super::ExponentToZero;
    use crate::derivation_rules::DerivationRule;

    #[test]
    fn test_1() {
        let start = power(i(1), i(0));
        let rule = ExponentToZero {};
        let result = rule.apply(start);
        assert_eq!(result.first().unwrap().0, i(1));
    }
}