symoxide 0.1.2

Intermediate Representation and Transformations for Computer Algebra Systems
Documentation
use hashbrown::HashMap;
use std::rc::Rc;
use symoxide::mappers::identity::IdentityMapper;
use symoxide::mappers::CachedMapper;
use symoxide::{parse, CachedMapper, Expression, ExpressionRawPointer};

#[derive(CachedMapper)]
struct Renamer {
    cache: HashMap<ExpressionRawPointer, Rc<Expression>>,
}

impl IdentityMapper for Renamer {
    fn map_variable(&mut self, name: String) -> Rc<Expression> {
        let new_name = match &name[..] {
            "x" => "foo",
            "y" => "bar",
            _ => panic!("Unknown variable {}", name),
        };
        Rc::new(Expression::Variable(new_name.to_string()))
    }
}

fn main() {
    let mut renamer = Renamer { cache: HashMap::new() };

    let xpy = parse("x+y");
    let xpy_renamed = renamer.visit(xpy.clone());
    println!("Old expr = {}", xpy);
    println!("New expr = {}", xpy_renamed);
}