math_parser_rs/dsl/optimizations/
general.rs1use crate::dsl::ast_types::{AstNode, OperatorKind};
2
3pub fn constant_folding(node: &AstNode) -> AstNode {
4 match node {
5 AstNode::FunctionCall { name, args } => AstNode::FunctionCall {
6 name: name.clone(),
7 args: args.clone(),
8 },
9 AstNode::BinaryOp { op, left, right } => {
10 let left_folded = Box::new(constant_folding(left));
11 let right_folded = Box::new(constant_folding(right));
12
13 match (&*left_folded, &*right_folded) {
14 (AstNode::Number(l), AstNode::Number(r)) => {
15 let value = match op {
16 OperatorKind::Plus => l + r,
17 OperatorKind::Minus => l - r,
18 OperatorKind::Multiply => l * r,
19 OperatorKind::Divide => l / r,
20 };
21 AstNode::Number(value)
22 }
23 _ => AstNode::BinaryOp {
24 op: *op,
25 left: left_folded,
26 right: right_folded,
27 },
28 }
29 }
30 AstNode::Number(n) => AstNode::Number(*n),
31 AstNode::Variable(v) => AstNode::Variable(v.clone()),
32 }
33}