1use super::super::{FunctionMeta, Registry};
2
3pub mod abs;
4pub mod average;
5pub mod special_fn;
6pub mod averageif;
7pub mod base;
8pub mod ceiling_floor;
9pub mod ceiling_floor_math;
10pub mod combin;
11pub mod combina;
12pub mod countif;
13pub mod countifs;
14pub mod countunique;
15pub mod criterion;
16pub mod decimal;
17pub mod exp;
18pub mod fact;
19pub mod factdouble;
20pub mod gcd;
21pub mod int_fn;
22pub mod iseven_isodd;
23pub mod subtotal;
24pub mod sequence;
25pub mod randarray;
26pub mod munit;
27pub mod array_fns;
28pub mod lcm;
29pub mod log;
30pub mod mod_fn;
31pub mod multinomial;
32pub mod power;
33pub mod product;
34pub mod quotient;
35pub mod rand;
36pub mod round;
37pub mod seriessum;
38pub mod sign;
39pub mod sqrt;
40pub mod sqrtpi;
41pub mod sum;
42pub mod sumif;
43pub mod sumifs;
44pub mod sumsq;
45pub mod trig;
46
47pub fn register_math(registry: &mut Registry) {
48 registry.register_eager("SUM", sum::sum_fn, FunctionMeta { category: "math", signature: "SUM(value1,...)", description: "Sum of arguments" });
49 registry.register_eager("AVERAGE", average::average_fn, FunctionMeta { category: "statistical", signature: "AVERAGE(value1,...)", description: "Arithmetic mean of arguments" });
50 registry.register_eager("PRODUCT", product::product_fn, FunctionMeta { category: "math", signature: "PRODUCT(value1,...)", description: "Product of arguments" });
51 registry.register_eager("ROUND", round::round_fn, FunctionMeta { category: "math", signature: "ROUND(number, digits)", description: "Round to specified decimal places" });
52 registry.register_eager("ROUNDUP", round::roundup_fn, FunctionMeta { category: "math", signature: "ROUNDUP(number, digits)", description: "Round away from zero" });
53 registry.register_eager("ROUNDDOWN", round::rounddown_fn, FunctionMeta { category: "math", signature: "ROUNDDOWN(number, digits)", description: "Round toward zero" });
54 registry.register_eager("INT", int_fn::int_fn, FunctionMeta { category: "math", signature: "INT(number)", description: "Round down to nearest integer" });
55 registry.register_eager("ABS", abs::abs_fn, FunctionMeta { category: "math", signature: "ABS(number)", description: "Absolute value of a number" });
56 registry.register_eager("SIGN", sign::sign_fn, FunctionMeta { category: "math", signature: "SIGN(number)", description: "Sign of a number: -1, 0, or 1" });
57 registry.register_eager("MOD", mod_fn::mod_fn, FunctionMeta { category: "math", signature: "MOD(number, divisor)", description: "Remainder after division" });
58 registry.register_eager("POWER", power::power_fn, FunctionMeta { category: "math", signature: "POWER(number, power)", description: "Number raised to a power" });
59 registry.register_eager("SQRT", sqrt::sqrt_fn, FunctionMeta { category: "math", signature: "SQRT(number)", description: "Square root" });
60 registry.register_eager("LOG", log::log_fn, FunctionMeta { category: "math", signature: "LOG(number, base)", description: "Logarithm to specified base" });
61 registry.register_eager("LOG10", log::log10_fn, FunctionMeta { category: "math", signature: "LOG10(number)", description: "Base-10 logarithm" });
62 registry.register_eager("LN", log::ln_fn, FunctionMeta { category: "math", signature: "LN(number)", description: "Natural logarithm" });
63 registry.register_eager("EXP", exp::exp_fn, FunctionMeta { category: "math", signature: "EXP(number)", description: "e raised to a power" });
64 registry.register_eager("CEILING", ceiling_floor::ceiling_fn, FunctionMeta { category: "math", signature: "CEILING(number, significance)", description: "Round up to nearest multiple of significance" });
65 registry.register_eager("FLOOR", ceiling_floor::floor_fn, FunctionMeta { category: "math", signature: "FLOOR(number, significance)", description: "Round down to nearest multiple of significance" });
66 registry.register_eager("CEILING.MATH", ceiling_floor_math::ceiling_math_fn, FunctionMeta { category: "math", signature: "CEILING.MATH(number, [significance], [mode])", description: "Round up to nearest multiple; handles negative numbers via mode" });
67 registry.register_eager("CEILING.PRECISE", ceiling_floor_math::ceiling_precise_fn, FunctionMeta { category: "math", signature: "CEILING.PRECISE(number, [significance])", description: "Round up to nearest multiple; sign of significance ignored" });
68 registry.register_eager("FLOOR.MATH", ceiling_floor_math::floor_math_fn, FunctionMeta { category: "math", signature: "FLOOR.MATH(number, [significance], [mode])", description: "Round down to nearest multiple; handles negative numbers via mode" });
69 registry.register_eager("FLOOR.PRECISE", ceiling_floor_math::floor_precise_fn, FunctionMeta { category: "math", signature: "FLOOR.PRECISE(number, [significance])", description: "Round down to nearest multiple; sign of significance ignored" });
70 registry.register_eager("ISO.CEILING", ceiling_floor_math::iso_ceiling_fn, FunctionMeta { category: "math", signature: "ISO.CEILING(number, [significance])", description: "ISO standard ceiling; identical to CEILING.PRECISE" });
71 registry.register_eager("RAND", rand::rand_fn, FunctionMeta { category: "math", signature: "RAND()", description: "Random number between 0 and 1" });
72 registry.register_eager("RANDBETWEEN",rand::randbetween_fn, FunctionMeta { category: "math", signature: "RANDBETWEEN(low, high)", description: "Random integer between two values" });
73 registry.register_eager("PI", trig::pi_fn, FunctionMeta { category: "math", signature: "PI()", description: "The value of pi (3.14159...)" });
74 registry.register_eager("SIN", trig::sin_fn, FunctionMeta { category: "math", signature: "SIN(angle)", description: "Sine of an angle in radians" });
75 registry.register_eager("COS", trig::cos_fn, FunctionMeta { category: "math", signature: "COS(angle)", description: "Cosine of an angle in radians" });
76 registry.register_eager("TAN", trig::tan_fn, FunctionMeta { category: "math", signature: "TAN(angle)", description: "Tangent of an angle in radians" });
77 registry.register_eager("ACOS", trig::acos_fn, FunctionMeta { category: "math", signature: "ACOS(number)", description: "Arccosine in radians" });
78 registry.register_eager("ASIN", trig::asin_fn, FunctionMeta { category: "math", signature: "ASIN(number)", description: "Arcsine in radians" });
79 registry.register_eager("ATAN", trig::atan_fn, FunctionMeta { category: "math", signature: "ATAN(number)", description: "Arctangent in radians" });
80 registry.register_eager("ATAN2", trig::atan2_fn, FunctionMeta { category: "math", signature: "ATAN2(x, y)", description: "Arctangent of y/x in radians" });
81 registry.register_eager("DEGREES", trig::degrees_fn, FunctionMeta { category: "math", signature: "DEGREES(angle)", description: "Convert radians to degrees" });
82 registry.register_eager("RADIANS", trig::radians_fn, FunctionMeta { category: "math", signature: "RADIANS(angle)", description: "Convert degrees to radians" });
83 registry.register_eager("SINH", trig::sinh_fn, FunctionMeta { category: "math", signature: "SINH(number)", description: "Hyperbolic sine" });
84 registry.register_eager("COSH", trig::cosh_fn, FunctionMeta { category: "math", signature: "COSH(number)", description: "Hyperbolic cosine" });
85 registry.register_eager("TANH", trig::tanh_fn, FunctionMeta { category: "math", signature: "TANH(number)", description: "Hyperbolic tangent" });
86 registry.register_eager("ACOSH", trig::acosh_fn, FunctionMeta { category: "math", signature: "ACOSH(number)", description: "Inverse hyperbolic cosine" });
87 registry.register_eager("ASINH", trig::asinh_fn, FunctionMeta { category: "math", signature: "ASINH(number)", description: "Inverse hyperbolic sine" });
88 registry.register_eager("ATANH", trig::atanh_fn, FunctionMeta { category: "math", signature: "ATANH(number)", description: "Inverse hyperbolic tangent" });
89 registry.register_eager("COT", trig::cot_fn, FunctionMeta { category: "math", signature: "COT(angle)", description: "Cotangent of an angle in radians" });
90 registry.register_eager("COTH", trig::coth_fn, FunctionMeta { category: "math", signature: "COTH(number)", description: "Hyperbolic cotangent" });
91 registry.register_eager("CSC", trig::csc_fn, FunctionMeta { category: "math", signature: "CSC(angle)", description: "Cosecant of an angle in radians" });
92 registry.register_eager("CSCH", trig::csch_fn, FunctionMeta { category: "math", signature: "CSCH(number)", description: "Hyperbolic cosecant" });
93 registry.register_eager("SEC", trig::sec_fn, FunctionMeta { category: "math", signature: "SEC(angle)", description: "Secant of an angle in radians" });
94 registry.register_eager("SECH", trig::sech_fn, FunctionMeta { category: "math", signature: "SECH(number)", description: "Hyperbolic secant" });
95 registry.register_eager("ACOT", trig::acot_fn, FunctionMeta { category: "math", signature: "ACOT(number)", description: "Inverse cotangent in radians" });
96 registry.register_eager("ACOTH", trig::acoth_fn, FunctionMeta { category: "math", signature: "ACOTH(number)", description: "Inverse hyperbolic cotangent" });
97 registry.register_eager("QUOTIENT", quotient::quotient_fn, FunctionMeta { category: "math", signature: "QUOTIENT(numerator, denominator)", description: "Integer portion of division" });
98 registry.register_eager("EVEN", round::even_fn, FunctionMeta { category: "math", signature: "EVEN(number)", description: "Round up to nearest even integer" });
99 registry.register_eager("ODD", round::odd_fn, FunctionMeta { category: "math", signature: "ODD(number)", description: "Round up to nearest odd integer" });
100 registry.register_eager("FACT", fact::fact_fn, FunctionMeta { category: "math", signature: "FACT(number)", description: "Factorial of a number" });
101 registry.register_eager("BASE", base::base_fn, FunctionMeta { category: "math", signature: "BASE(value, base, [min_length])", description: "Convert number to string in given base" });
102 registry.register_eager("DECIMAL", decimal::decimal_fn, FunctionMeta { category: "math", signature: "DECIMAL(text, base)", description: "Convert string in given base to decimal" });
103 registry.register_eager("MROUND", round::mround_fn, FunctionMeta { category: "math", signature: "MROUND(number, multiple)", description: "Round to nearest multiple" });
104 registry.register_eager("TRUNC", round::trunc_fn, FunctionMeta { category: "math", signature: "TRUNC(number, digits)", description: "Truncate to integer or decimal places" });
105 registry.register_eager("COUNTIF", countif::countif_fn, FunctionMeta { category: "math", signature: "COUNTIF(range, criterion)", description: "Count cells matching criterion" });
106 registry.register_eager("COUNTIFS", countifs::countifs_fn, FunctionMeta { category: "math", signature: "COUNTIFS(range1, criterion1, ...)", description: "Count rows where all criteria match" });
107 registry.register_eager("COUNTUNIQUE",countunique::countunique_fn, FunctionMeta { category: "math", signature: "COUNTUNIQUE(value1, ...)", description: "Count unique distinct values" });
108 registry.register_lazy("SUMIF", sumif::sumif_fn, FunctionMeta { category: "math", signature: "SUMIF(range, criterion, [sum_range])", description: "Sum cells where range matches criterion" });
109 registry.register_lazy("SUMIFS", sumifs::sumifs_fn, FunctionMeta { category: "math", signature: "SUMIFS(sum_range, range1, criterion1, ...)", description: "Sum cells where all criteria match" });
110 registry.register_eager("AVERAGEIF", averageif::averageif_fn, FunctionMeta { category: "statistical", signature: "AVERAGEIF(range, criterion, [avg_range])", description: "Average cells where range matches criterion" });
111 registry.register_eager("SQRTPI", sqrtpi::sqrtpi_fn, FunctionMeta { category: "math", signature: "SQRTPI(n)", description: "Square root of n times pi" });
112 registry.register_eager("SUMSQ", sumsq::sumsq_fn, FunctionMeta { category: "math", signature: "SUMSQ(value1,...)", description: "Sum of squares of arguments" });
113 registry.register_eager("FACTDOUBLE", factdouble::factdouble_fn, FunctionMeta { category: "math", signature: "FACTDOUBLE(n)", description: "Double factorial of a number" });
114 registry.register_eager("SERIESSUM", seriessum::seriessum_fn, FunctionMeta { category: "math", signature: "SERIESSUM(x, n, m, coefficients)", description: "Sum of a power series" });
115
116 registry.register_eager("COMBIN", combin::combin_fn, FunctionMeta { category: "math", signature: "COMBIN(n, k)", description: "Number of combinations without repetition" });
117 registry.register_eager("COMBINA", combina::combina_fn, FunctionMeta { category: "math", signature: "COMBINA(n, k)", description: "Number of combinations with repetition" });
118 registry.register_eager("MULTINOMIAL", multinomial::multinomial_fn, FunctionMeta { category: "math", signature: "MULTINOMIAL(value1,...)", description: "Multinomial coefficient of given arguments" });
119 registry.register_eager("GCD", gcd::gcd_fn, FunctionMeta { category: "math", signature: "GCD(value1,...)", description: "Greatest common divisor" });
120 registry.register_eager("LCM", lcm::lcm_fn, FunctionMeta { category: "math", signature: "LCM(value1,...)", description: "Least common multiple" });
121 registry.register_eager("ISEVEN", iseven_isodd::iseven_fn, FunctionMeta { category: "math", signature: "ISEVEN(number)", description: "Returns TRUE if number is even" });
122 registry.register_eager("ISODD", iseven_isodd::isodd_fn, FunctionMeta { category: "math", signature: "ISODD(number)", description: "Returns TRUE if number is odd" });
123 registry.register_eager("MUNIT", munit::munit_fn, FunctionMeta { category: "math", signature: "MUNIT(dimension)", description: "Returns identity matrix of given dimension" });
124 registry.register_eager("SEQUENCE", sequence::sequence_fn, FunctionMeta { category: "math", signature: "SEQUENCE(rows, [cols], [start], [step])", description: "Generate a sequence of numbers" });
125 registry.register_eager("RANDARRAY", randarray::randarray_fn, FunctionMeta { category: "math", signature: "RANDARRAY([rows], [cols])", description: "Array of random numbers" });
126 registry.register_eager("SUBTOTAL", subtotal::subtotal_fn, FunctionMeta { category: "math", signature: "SUBTOTAL(function_code, ref1, ...)", description: "Apply function to a list (not supported with arrays)" });
127
128 registry.register_eager("ERF", special_fn::erf_fn, FunctionMeta { category: "math", signature: "ERF(lower_limit, [upper_limit])", description: "Error function" });
130 registry.register_eager("ERF.PRECISE", special_fn::erf_precise_fn, FunctionMeta { category: "math", signature: "ERF.PRECISE(x)", description: "Error function (precise)" });
131 registry.register_eager("ERFC", special_fn::erfc_fn, FunctionMeta { category: "math", signature: "ERFC(x)", description: "Complementary error function" });
132 registry.register_eager("ERFC.PRECISE", special_fn::erfc_precise_fn, FunctionMeta { category: "math", signature: "ERFC.PRECISE(x)", description: "Complementary error function (precise)" });
133 registry.register_eager("GAMMALN", special_fn::gammaln_fn, FunctionMeta { category: "math", signature: "GAMMALN(x)", description: "Natural logarithm of the gamma function" });
134 registry.register_eager("GAMMALN.PRECISE", special_fn::gammaln_precise_fn, FunctionMeta { category: "math", signature: "GAMMALN.PRECISE(x)", description: "Natural logarithm of the gamma function (precise)" });
135}