math_parser_rs/dsl/optimizations/
trig.rs1use crate::dsl::ast_types::{AstNode, OperatorKind};
2
3pub fn rewrite_cos_as_sin(node: &AstNode) -> AstNode {
4 match node {
5 AstNode::FunctionCall { name, args } if name == "cos" && args.len() == 1 => {
6 AstNode::FunctionCall {
7 name: "sin".to_string(),
8 args: vec![AstNode::BinaryOp {
9 op: OperatorKind::Plus,
10 left: Box::new(rewrite_cos_as_sin(&args[0])),
11 right: Box::new(AstNode::Number(std::f64::consts::FRAC_PI_2)), }],
13 }
14 }
15 AstNode::FunctionCall { name, args } => AstNode::FunctionCall {
16 name: name.clone(),
17 args: args.iter().map(rewrite_cos_as_sin).collect(),
18 },
19 AstNode::BinaryOp { op, left, right } => AstNode::BinaryOp {
20 op: *op,
21 left: Box::new(rewrite_cos_as_sin(left)),
22 right: Box::new(rewrite_cos_as_sin(right)),
23 },
24 AstNode::Number(n) => AstNode::Number(*n),
25 AstNode::Variable(v) => AstNode::Variable(v.clone()),
26 }
27}