smart-calculator 1.0.3

Natural-language calculator for math, units, time zones, dates, fiat, and crypto conversions
Documentation
use std::collections::HashMap;
use std::f64::consts;
use std::sync::LazyLock;

pub type Number = f64;
pub type UnaryFn = fn(Number) -> Number;
pub type BinaryFn = fn(Number, Number) -> Number;

pub static CONSTANTS: LazyLock<HashMap<&'static str, Number>> = LazyLock::new(|| {
    HashMap::from([
        ("pi", consts::PI),
        ("π", consts::PI),
        ("e", consts::E),
        ("tau", consts::TAU),
        ("τ", consts::TAU),
        ("phi", (1.0 + 5.0_f64.sqrt()) / 2.0),
        ("φ", (1.0 + 5.0_f64.sqrt()) / 2.0),
        ("inf", Number::INFINITY),
        ("infinity", Number::INFINITY),
    ])
});

pub static FUNCTIONS: LazyLock<HashMap<&'static str, UnaryFn>> = LazyLock::new(|| {
    HashMap::from([
        ("sqrt", f64::sqrt as UnaryFn),
        ("cbrt", f64::cbrt as UnaryFn),
        ("abs", f64::abs as UnaryFn),
        ("ceil", f64::ceil as UnaryFn),
        ("floor", f64::floor as UnaryFn),
        ("round", f64::round as UnaryFn),
        ("trunc", f64::trunc as UnaryFn),
        ("sign", f64::signum as UnaryFn),
        ("log", f64::log10 as UnaryFn),
        ("log2", f64::log2 as UnaryFn),
        ("log10", f64::log10 as UnaryFn),
        ("ln", f64::ln as UnaryFn),
        ("exp", f64::exp as UnaryFn),
        ("sin", f64::sin as UnaryFn),
        ("cos", f64::cos as UnaryFn),
        ("tan", f64::tan as UnaryFn),
        ("asin", f64::asin as UnaryFn),
        ("acos", f64::acos as UnaryFn),
        ("atan", f64::atan as UnaryFn),
        ("sinh", f64::sinh as UnaryFn),
        ("cosh", f64::cosh as UnaryFn),
        ("tanh", f64::tanh as UnaryFn),
        ("asinh", f64::asinh as UnaryFn),
        ("acosh", f64::acosh as UnaryFn),
        ("atanh", f64::atanh as UnaryFn),
    ])
});

pub static FUNCTIONS2: LazyLock<HashMap<&'static str, BinaryFn>> = LazyLock::new(|| {
    HashMap::from([
        ("pow", f64::powf as BinaryFn),
        ("max", f64::max as BinaryFn),
        ("min", f64::min as BinaryFn),
        ("atan2", f64::atan2 as BinaryFn),
        ("mod", |a, b| ((a % b) + b) % b),
    ])
});