Skip to main content

math_parser_rs/dsl/optimizations/
general.rs

1use 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}