1use std::sync::OnceLock;
2
3use crate::symbol::{SymbolId, SymbolTable};
4
5pub struct BuiltinSymbols {
8 pub e: SymbolId,
9 pub pi: SymbolId,
10 pub i: SymbolId,
11 pub tau: SymbolId,
12 pub inf: SymbolId,
13 pub gamma: SymbolId,
14 pub phi: SymbolId,
15 pub sqrt: SymbolId,
16 pub exp: SymbolId,
17 pub log: SymbolId,
18 pub ln: SymbolId,
19 pub sin: SymbolId,
20 pub cos: SymbolId,
21 pub tan: SymbolId,
22 pub sigma: SymbolId,
23 pub prod: SymbolId,
24 pub int: SymbolId,
25 pub partial: SymbolId,
26 pub abs: SymbolId,
27}
28
29pub(crate) fn register(t: &SymbolTable) {
31 t.intern_display("e", "\\e");
32 t.intern_display("pi", "\\pi");
33 t.intern_display("i", "\\i");
34 t.intern_display("tau", "\\tau");
35 t.intern_display("infty", "\\infty");
36 t.intern_display("gamma", "\\gamma");
37 t.intern_display("phi", "\\phi");
38 t.intern_display("sqrt", "\\sqrt");
39 t.intern_display("exp", "\\exp");
40 t.intern_display("log", "\\log");
41 t.intern_display("ln", "\\ln");
42 t.intern_display("sin", "\\sin");
43 t.intern_display("cos", "\\cos");
44 t.intern_display("tan", "\\tan");
45 t.intern_display("sigma", "\\sigma");
46 t.intern_display("prod", "\\prod");
47 t.intern_display("int", "\\int");
48 t.intern_display("partial", "\\partial");
49 t.intern_display("abs", "\\mathrm{abs}");
50}
51
52impl BuiltinSymbols {
53 pub fn global() -> &'static BuiltinSymbols {
54 static B: OnceLock<BuiltinSymbols> = OnceLock::new();
55 B.get_or_init(|| {
56 let t = SymbolTable::global();
57 BuiltinSymbols {
58 e: t.intern("e"),
59 pi: t.intern("pi"),
60 i: t.intern("i"),
61 tau: t.intern("tau"),
62 inf: t.intern("infty"),
63 gamma: t.intern("gamma"),
64 phi: t.intern("phi"),
65 sqrt: t.intern("sqrt"),
66 exp: t.intern("exp"),
67 log: t.intern("log"),
68 ln: t.intern("ln"),
69 sin: t.intern("sin"),
70 cos: t.intern("cos"),
71 tan: t.intern("tan"),
72 sigma: t.intern("sigma"),
73 prod: t.intern("prod"),
74 int: t.intern("int"),
75 partial: t.intern("partial"),
76 abs: t.intern("abs"),
77 }
78 })
79 }
80}