prima-core 0.3.5

Prima numeric tower, Value and hash-consing expression pool
Documentation
use std::sync::OnceLock;

use crate::symbol::{SymbolId, SymbolTable};

/// Built-in symbol set (spec §7.1–7.2): each math constant and operator holds a pre-resolved `SymbolId`,
/// letting the simplification engine compare symbols in O(1). Physical constants (spec §7.3) are registered in a later release.
pub struct BuiltinSymbols {
    pub e: SymbolId,
    pub pi: SymbolId,
    pub i: SymbolId,
    pub tau: SymbolId,
    pub inf: SymbolId,
    pub gamma: SymbolId,
    pub phi: SymbolId,
    pub sqrt: SymbolId,
    pub exp: SymbolId,
    pub log: SymbolId,
    pub ln: SymbolId,
    pub sin: SymbolId,
    pub cos: SymbolId,
    pub tan: SymbolId,
    pub sigma: SymbolId,
    pub prod: SymbolId,
    pub int: SymbolId,
    pub partial: SymbolId,
    pub abs: SymbolId,
}

// Register math constants and operators (spec §7.1–7.2); the TeX name is used as the display name.
pub(crate) fn register(t: &SymbolTable) {
    t.intern_display("e", "\\e");
    t.intern_display("pi", "\\pi");
    t.intern_display("i", "\\i");
    t.intern_display("tau", "\\tau");
    t.intern_display("infty", "\\infty");
    t.intern_display("gamma", "\\gamma");
    t.intern_display("phi", "\\phi");
    t.intern_display("sqrt", "\\sqrt");
    t.intern_display("exp", "\\exp");
    t.intern_display("log", "\\log");
    t.intern_display("ln", "\\ln");
    t.intern_display("sin", "\\sin");
    t.intern_display("cos", "\\cos");
    t.intern_display("tan", "\\tan");
    t.intern_display("sigma", "\\sigma");
    t.intern_display("prod", "\\prod");
    t.intern_display("int", "\\int");
    t.intern_display("partial", "\\partial");
    t.intern_display("abs", "\\mathrm{abs}");
}

impl BuiltinSymbols {
    pub fn global() -> &'static BuiltinSymbols {
        static B: OnceLock<BuiltinSymbols> = OnceLock::new();
        B.get_or_init(|| {
            let t = SymbolTable::global();
            BuiltinSymbols {
                e: t.intern("e"),
                pi: t.intern("pi"),
                i: t.intern("i"),
                tau: t.intern("tau"),
                inf: t.intern("infty"),
                gamma: t.intern("gamma"),
                phi: t.intern("phi"),
                sqrt: t.intern("sqrt"),
                exp: t.intern("exp"),
                log: t.intern("log"),
                ln: t.intern("ln"),
                sin: t.intern("sin"),
                cos: t.intern("cos"),
                tan: t.intern("tan"),
                sigma: t.intern("sigma"),
                prod: t.intern("prod"),
                int: t.intern("int"),
                partial: t.intern("partial"),
                abs: t.intern("abs"),
            }
        })
    }
}