use crate::dsl::ast_types::{AstNode, OperatorKind};
pub fn rewrite_cos_as_sin(node: &AstNode) -> AstNode {
match node {
AstNode::FunctionCall { name, args } if name == "cos" && args.len() == 1 => {
AstNode::FunctionCall {
name: "sin".to_string(),
args: vec![AstNode::BinaryOp {
op: OperatorKind::Plus,
left: Box::new(rewrite_cos_as_sin(&args[0])),
right: Box::new(AstNode::Number(std::f64::consts::FRAC_PI_2)), }],
}
}
AstNode::FunctionCall { name, args } => AstNode::FunctionCall {
name: name.clone(),
args: args.iter().map(rewrite_cos_as_sin).collect(),
},
AstNode::BinaryOp { op, left, right } => AstNode::BinaryOp {
op: *op,
left: Box::new(rewrite_cos_as_sin(left)),
right: Box::new(rewrite_cos_as_sin(right)),
},
AstNode::Number(n) => AstNode::Number(*n),
AstNode::Variable(v) => AstNode::Variable(v.clone()),
}
}