use std::collections::HashSet;
use std::sync::LazyLock;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum TokenCategory {
Number,
Identifier,
Constant,
GreekSymbol,
Function,
LeftParen,
RightParen,
Operator,
Other,
}
pub static CONSTANTS: LazyLock<HashSet<&'static str>> = LazyLock::new(|| {
HashSet::from([
"PI",
"E_CONST",
"I_CONST",
"INFINITY",
"PHI",
"GOLDEN_RATIO",
"EULER_GAMMA",
"GAMMA_CONST",
"UNDEFINED",
"LATEX_PI",
"LATEX_PHI",
"LATEX_VARPHI",
"LATEX_INFTY",
"LATEX_EULER_GAMMA",
"LATEX_GAMMA", "WOLFRAM_GAMMA", ])
});
pub static GREEK_SYMBOLS: LazyLock<HashSet<&'static str>> = LazyLock::new(|| {
HashSet::from([
"LATEX_ALPHA",
"LATEX_BETA",
"LATEX_DELTA",
"LATEX_EPSILON",
"LATEX_ZETA",
"LATEX_ETA",
"LATEX_THETA",
"LATEX_IOTA",
"LATEX_KAPPA",
"LATEX_LAMBDA",
"LATEX_MU",
"LATEX_NU",
"LATEX_XI",
"LATEX_OMICRON",
"LATEX_RHO",
"LATEX_SIGMA",
"LATEX_TAU",
"LATEX_UPSILON",
"LATEX_CHI",
"LATEX_PSI",
"LATEX_OMEGA",
"WOLFRAM_ALPHA",
"WOLFRAM_BETA",
"WOLFRAM_DELTA",
"WOLFRAM_EPSILON",
"WOLFRAM_ZETA",
"WOLFRAM_ETA",
"WOLFRAM_THETA",
"WOLFRAM_IOTA",
"WOLFRAM_KAPPA",
"WOLFRAM_LAMBDA",
"WOLFRAM_MU",
"WOLFRAM_NU",
"WOLFRAM_XI",
"WOLFRAM_OMICRON",
"WOLFRAM_RHO",
"WOLFRAM_SIGMA",
"WOLFRAM_TAU",
"WOLFRAM_UPSILON",
"WOLFRAM_CHI",
"WOLFRAM_PSI",
"WOLFRAM_OMEGA",
])
});
pub static FUNCTIONS: LazyLock<HashSet<&'static str>> = LazyLock::new(|| {
HashSet::from([
"sin", "cos", "tan", "sec", "csc", "cot", "sinh", "cosh", "tanh", "sech", "csch", "coth",
"arcsin", "arccos", "arctan", "arcsec", "arccsc", "arccot", "asin", "acos", "atan", "asec",
"acsc", "acot", "log", "ln", "exp", "sqrt", "abs", "floor", "ceil", "round", "sign", "max",
"min", "gcd", "lcm", "gamma", "beta", "zeta", "erf", "erfc", "J", "Y", "I",
"K", "P", "Q", "L", "H", "F", "G", "U", "M", "W", ])
});
pub static IMPLICIT_MUL_RULES: LazyLock<HashSet<(TokenCategory, TokenCategory)>> =
LazyLock::new(|| {
HashSet::from([
(TokenCategory::Number, TokenCategory::Identifier),
(TokenCategory::Number, TokenCategory::Constant),
(TokenCategory::Number, TokenCategory::GreekSymbol),
(TokenCategory::Number, TokenCategory::LeftParen),
(TokenCategory::Identifier, TokenCategory::Identifier),
(TokenCategory::Identifier, TokenCategory::Constant),
(TokenCategory::Identifier, TokenCategory::GreekSymbol),
(TokenCategory::Constant, TokenCategory::Identifier),
(TokenCategory::Constant, TokenCategory::Constant),
(TokenCategory::Constant, TokenCategory::GreekSymbol),
(TokenCategory::Constant, TokenCategory::LeftParen),
(TokenCategory::GreekSymbol, TokenCategory::Identifier),
(TokenCategory::GreekSymbol, TokenCategory::Constant),
(TokenCategory::GreekSymbol, TokenCategory::GreekSymbol),
(TokenCategory::GreekSymbol, TokenCategory::LeftParen),
(TokenCategory::RightParen, TokenCategory::Identifier),
(TokenCategory::RightParen, TokenCategory::Constant),
(TokenCategory::RightParen, TokenCategory::GreekSymbol),
(TokenCategory::RightParen, TokenCategory::LeftParen),
])
});