use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, PartialEq)]
pub enum ASTNode {
Number { value: f64 },
Exponentiate { left: Box<ASTNode>, right: Box<ASTNode> },
Add { left: Box<ASTNode>, right: Box<ASTNode> },
Subtract { left: Box<ASTNode>, right: Box<ASTNode> },
Multiply { left: Box<ASTNode>, right: Box<ASTNode> },
Divide { left: Box<ASTNode>, right: Box<ASTNode> },
}
impl ASTNode {
pub fn postorder_traverse<Visitor: FnMut(&ASTNode) -> ()>(&self, visit_fn: &mut Visitor) {
match self {
ASTNode::Add {left, right}
| ASTNode::Subtract {left, right}
| ASTNode::Multiply {left, right}
| ASTNode::Divide { left, right }
| ASTNode::Exponentiate { left, right} => {
left.postorder_traverse(visit_fn);
right.postorder_traverse(visit_fn);
}
_ => {}
}
visit_fn(&self);
}
}