use core::f64;
use crate::{context::Symbol, token::Function, utils::built_in_functions};
#[derive(Debug, PartialEq, PartialOrd)]
pub enum Identifier<'a> {
Function(Function),
Constant(f64),
Variable(&'a str),
}
impl<'a> Identifier<'a> {
pub(crate) fn from_str(value: &'a str) -> Self {
match value {
"pi" => f64::consts::PI.into(),
"e" => f64::consts::E.into(),
"sin" => built_in_functions::SIN.into(),
"sinh" => built_in_functions::SINH.into(),
"asin" => built_in_functions::ASIN.into(),
"asinh" => built_in_functions::ASINH.into(),
"cos" => built_in_functions::COS.into(),
"cosh" => built_in_functions::COSH.into(),
"acos" => built_in_functions::ACOS.into(),
"acosh" => built_in_functions::ACOSH.into(),
"tan" => built_in_functions::TAN.into(),
"tanh" => built_in_functions::TANH.into(),
"atan" => built_in_functions::ATAN.into(),
"atan2" => built_in_functions::ATAN2.into(),
"atanh" => built_in_functions::ATANH.into(),
"ln" => built_in_functions::LN.into(),
"log" => built_in_functions::LOG.into(),
"logn" => built_in_functions::LOGN.into(),
"sqrt" => built_in_functions::SQRT.into(),
"cbrt" => built_in_functions::CBRT.into(),
"exp" => built_in_functions::EXP.into(),
"abs" => built_in_functions::ABS.into(),
"floor" => built_in_functions::FLOOR.into(),
"ceil" => built_in_functions::CEIL.into(),
"round" => built_in_functions::ROUND.into(),
"trunc" => built_in_functions::TRUNC.into(),
"sum" => built_in_functions::SUM.into(),
"mean" => built_in_functions::MEAN.into(),
"invert" | "recip" => built_in_functions::RECIP.into(),
"min" => built_in_functions::MIN.into(),
"max" => built_in_functions::MAX.into(),
"hypot" => built_in_functions::HYPOT.into(),
"fract" => built_in_functions::FRACT.into(),
"gamma" => built_in_functions::GAMMA.into(),
"factorial" => built_in_functions::FACTORIAL.into(),
_ => Identifier::Variable(value),
}
}
}
impl<T> From<T> for Identifier<'_>
where
T: Into<f64>,
{
fn from(value: T) -> Self {
Identifier::Constant(value.into())
}
}
impl From<Function> for Identifier<'_> {
fn from(value: Function) -> Self {
Identifier::Function(value)
}
}
impl From<Symbol> for Identifier<'_> {
fn from(symbol: Symbol) -> Self {
match symbol {
Symbol::Variable(value) => Identifier::Constant(value),
Symbol::Function(value) => Identifier::Function(value),
}
}
}