use crate::core::{Expression, Number};
pub fn sinh(arg: &Expression) -> Expression {
match arg {
Expression::Number(Number::Integer(0)) => Expression::integer(0),
Expression::Number(Number::Float(f)) => Expression::float(f.sinh()),
Expression::Number(Number::Integer(i)) => Expression::float((*i as f64).sinh()),
_ => Expression::function("sinh", vec![arg.clone()]),
}
}
pub fn cosh(arg: &Expression) -> Expression {
match arg {
Expression::Number(Number::Integer(0)) => Expression::integer(1),
Expression::Number(Number::Float(f)) => Expression::float(f.cosh()),
Expression::Number(Number::Integer(i)) => Expression::float((*i as f64).cosh()),
_ => Expression::function("cosh", vec![arg.clone()]),
}
}
pub fn tanh(arg: &Expression) -> Expression {
match arg {
Expression::Number(Number::Integer(0)) => Expression::integer(0),
Expression::Number(Number::Float(f)) => Expression::float(f.tanh()),
Expression::Number(Number::Integer(i)) => Expression::float((*i as f64).tanh()),
_ => Expression::function("tanh", vec![arg.clone()]),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_sinh_zero() {
assert_eq!(sinh(&Expression::integer(0)), Expression::integer(0));
}
#[test]
fn test_cosh_zero() {
assert_eq!(cosh(&Expression::integer(0)), Expression::integer(1));
}
#[test]
fn test_tanh_zero() {
assert_eq!(tanh(&Expression::integer(0)), Expression::integer(0));
}
}