name:
src/main/js/formulas/FormulaCaller.ts
-rw-r--r--
10555
1import { NameException } from "../errors/NameException";
2import { SheetColumnRowKey } from "../models/common/SheetColumnRowKey";
3import { CollateralLookupFunction, Complex, LookupFunction } from "../models/common/Types";
4import { AbstractFormula } from "./AbstractFormula";
5import { BIN2DEC } from "./engineering/BIN2DEC";
6import { BIN2HEX } from "./engineering/BIN2HEX";
7import { DELTA } from "./engineering/DELTA";
8import { FormulaName } from "./FormulaName";
9import { ERRORTYPE } from "./info/ERRORTYPE";
10import { ISBLANK } from "./info/ISBLANK";
11import { ISERR } from "./info/ISERR";
12import { ISERROR } from "./info/ISERROR";
13import { ISLOGICAL } from "./info/ISLOGICAL";
14import { ISNA } from "./info/ISNA";
15import { ISNONTEXT } from "./info/ISNONTEXT";
16import { ISNUMBER } from "./info/ISNUMBER";
17import { ISTEXT } from "./info/ISTEXT";
18import { N } from "./info/N";
19import { NA } from "./info/NA";
20import { TYPE } from "./info/TYPE";
21import { AND } from "./logic/AND";
22import { EQ } from "./logic/EQ";
23import { EXACT } from "./logic/EXACT";
24import { FALSE } from "./logic/FALSE";
25import { GT } from "./logic/GT";
26import { GTE } from "./logic/GTE";
27import { IF } from "./logic/IF";
28import { IFERROR } from "./logic/IFERROR";
29import { IFNA } from "./logic/IFNA";
30import { LT } from "./logic/LT";
31import { LTE } from "./logic/LTE";
32import { NE } from "./logic/NE";
33import { NOT } from "./logic/NOT";
34import { OR } from "./logic/OR";
35import { TRUE } from "./logic/TRUE";
36import { XOR } from "./logic/XOR";
37import { ABS } from "./math/ABS";
38import { ACOS } from "./math/ACOS";
39import { ACOSH } from "./math/ACOSH";
40import { ACOT } from "./math/ACOT";
41import { ACOTH } from "./math/ACOTH";
42import { ADD } from "./math/ADD";
43import { ASIN } from "./math/ASIN";
44import { ASINH } from "./math/ASINH";
45import { ATAN } from "./math/ATAN";
46import { ATAN2 } from "./math/ATAN2";
47import { ATANH } from "./math/ATANH";
48import { COS } from "./math/COS";
49import { COSH } from "./math/COSH";
50import { COT } from "./math/COT";
51import { DIVIDE } from "./math/DIVIDE";
52import { EVEN } from "./math/EVEN";
53import { FLOOR } from "./math/FLOOR";
54import { INT } from "./math/INT";
55import { ISEVEN } from "./math/ISEVEN";
56import { ISODD } from "./math/ISODD";
57import { LN } from "./math/LN";
58import { LOG } from "./math/LOG";
59import { LOG10 } from "./math/LOG10";
60import { MINUS } from "./math/MINUS";
61import { MOD } from "./math/MOD";
62import { MULTIPLY } from "./math/MULTIPLY";
63import { ODD } from "./math/ODD";
64import { PI } from "./math/PI";
65import { POW } from "./math/POW";
66import { PRODUCT } from "./math/PRODUCT";
67import { QUOTIENT } from "./math/QUOTIENT";
68import { RAND } from "./math/RAND";
69import { RANDBETWEEN } from "./math/RANDBETWEEN";
70import { ROUND } from "./math/ROUND";
71import { ROUNDDOWN } from "./math/ROUNDDOWN";
72import { ROUNDUP } from "./math/ROUNDUP";
73import { SIGN } from "./math/SIGN";
74import { SIN } from "./math/SIN";
75import { SINH } from "./math/SINH";
76import { SQRT } from "./math/SQRT";
77import { SQRTPI } from "./math/SQRTPI";
78import { SUM } from "./math/SUM";
79import { TAN } from "./math/TAN";
80import { TANH } from "./math/TANH";
81import { UMINUS } from "./math/UMINUS";
82import { UNARY_PERCENT } from "./math/UNARY_PERCENT";
83import { UPLUS } from "./math/UPLUS";
84import { TO_PERCENT } from "./parser/TO_PERCENT";
85import { TO_TEXT } from "./parser/TO_TEXT";
86import { AVERAGE } from "./statistical/AVERAGE";
87import { AVERAGEA } from "./statistical/AVERAGEA";
88import { COUNT } from "./statistical/COUNT";
89import { COUNTA } from "./statistical/COUNTA";
90import { COUNTBLANK } from "./statistical/COUNTBLANK";
91import { MAX } from "./statistical/MAX";
92import { MAXA } from "./statistical/MAXA";
93import { MIN } from "./statistical/MIN";
94import { MINA } from "./statistical/MINA";
95import { CONCAT } from "./text/CONCAT";
96
97export class FormulaCaller {
98 readonly formulas: { [index: string]: AbstractFormula };
99 readonly customFormulas: { [index: string]: unknown };
100 private lookup: LookupFunction;
101 private collateralLookup: CollateralLookupFunction;
102
103 constructor(
104 lookup: LookupFunction,
105 collateralLookup: CollateralLookupFunction,
106 customFormulas?: { [index: string]: unknown }
107 ) {
108 this.lookup = lookup;
109 this.collateralLookup = collateralLookup;
110 this.formulas = {
111 [FormulaName.ADD]: new ADD(lookup, collateralLookup),
112 [FormulaName.MINUS]: new MINUS(lookup, collateralLookup),
113 [FormulaName.DIVIDE]: new DIVIDE(lookup, collateralLookup),
114 [FormulaName.MULTIPLY]: new MULTIPLY(lookup, collateralLookup),
115 [FormulaName.POW]: new POW(lookup, collateralLookup),
116 [FormulaName.POWER]: new POW(lookup, collateralLookup),
117 [FormulaName.EQ]: new EQ(lookup, collateralLookup),
118 [FormulaName.NE]: new NE(lookup, collateralLookup),
119 [FormulaName.GT]: new GT(lookup, collateralLookup),
120 [FormulaName.GTE]: new GTE(lookup, collateralLookup),
121 [FormulaName.LT]: new LT(lookup, collateralLookup),
122 [FormulaName.LTE]: new LTE(lookup, collateralLookup),
123 [FormulaName.UMINUS]: new UMINUS(lookup, collateralLookup),
124 [FormulaName.UPLUS]: new UPLUS(lookup, collateralLookup),
125 [FormulaName.UNARY_PERCENT]: new UNARY_PERCENT(lookup, collateralLookup),
126 [FormulaName.CONCAT]: new CONCAT(lookup, collateralLookup),
127 [FormulaName.TRUE]: TRUE.SELF,
128 [FormulaName.FALSE]: FALSE.SELF,
129 [FormulaName.SUM]: new SUM(lookup, collateralLookup),
130 [FormulaName.ERRORTYPE]: new ERRORTYPE(lookup, collateralLookup),
131 [FormulaName.ISBLANK]: new ISBLANK(lookup, collateralLookup),
132 [FormulaName.ISERR]: new ISERR(lookup, collateralLookup),
133 [FormulaName.ISERROR]: new ISERROR(lookup, collateralLookup),
134 [FormulaName.ISLOGICAL]: new ISLOGICAL(lookup, collateralLookup),
135 [FormulaName.IF]: new IF(lookup, collateralLookup),
136 [FormulaName.ISNA]: new ISNA(lookup, collateralLookup),
137 [FormulaName.ISNONTEXT]: new ISNONTEXT(lookup, collateralLookup),
138 [FormulaName.ISNUMBER]: new ISNUMBER(lookup, collateralLookup),
139 [FormulaName.ISTEXT]: new ISTEXT(lookup, collateralLookup),
140 [FormulaName.N]: new N(lookup, collateralLookup),
141 [FormulaName.NA]: new NA(lookup, collateralLookup),
142 [FormulaName.TYPE]: new TYPE(lookup, collateralLookup),
143 [FormulaName.AND]: new AND(lookup, collateralLookup),
144 [FormulaName.EXACT]: new EXACT(lookup, collateralLookup),
145 [FormulaName.IFERROR]: new IFERROR(lookup, collateralLookup),
146 [FormulaName.IFNA]: new IFNA(lookup, collateralLookup),
147 [FormulaName.NOT]: new NOT(lookup, collateralLookup),
148 [FormulaName.OR]: new OR(lookup, collateralLookup),
149 [FormulaName.XOR]: new XOR(lookup, collateralLookup),
150 [FormulaName.ABS]: new ABS(lookup, collateralLookup),
151 [FormulaName.ACOS]: new ACOS(lookup, collateralLookup),
152 [FormulaName.ACOSH]: new ACOSH(lookup, collateralLookup),
153 [FormulaName.ACOT]: new ACOT(lookup, collateralLookup),
154 [FormulaName.ACOTH]: new ACOTH(lookup, collateralLookup),
155 [FormulaName.ASIN]: new ASIN(lookup, collateralLookup),
156 [FormulaName.ASINH]: new ASINH(lookup, collateralLookup),
157 [FormulaName.ATAN]: new ATAN(lookup, collateralLookup),
158 [FormulaName.ATAN2]: new ATAN2(lookup, collateralLookup),
159 [FormulaName.ATANH]: new ATANH(lookup, collateralLookup),
160 [FormulaName.COS]: new COS(lookup, collateralLookup),
161 [FormulaName.COSH]: new COSH(lookup, collateralLookup),
162 [FormulaName.COT]: new COT(lookup, collateralLookup),
163 [FormulaName.EVEN]: new EVEN(lookup, collateralLookup),
164 [FormulaName.INT]: new INT(lookup, collateralLookup),
165 [FormulaName.ROUNDDOWN]: new ROUNDDOWN(lookup, collateralLookup),
166 [FormulaName.ROUNDUP]: new ROUNDUP(lookup, collateralLookup),
167 [FormulaName.ROUND]: new ROUND(lookup, collateralLookup),
168 [FormulaName.ISEVEN]: new ISEVEN(lookup, collateralLookup),
169 [FormulaName.ISODD]: new ISODD(lookup, collateralLookup),
170 [FormulaName.LN]: new LN(lookup, collateralLookup),
171 [FormulaName.LOG]: new LOG(lookup, collateralLookup),
172 [FormulaName.LOG10]: new LOG10(lookup, collateralLookup),
173 [FormulaName.MOD]: new MOD(lookup, collateralLookup),
174 [FormulaName.ODD]: new ODD(lookup, collateralLookup),
175 [FormulaName.PI]: PI.SELF,
176 [FormulaName.PRODUCT]: new PRODUCT(lookup, collateralLookup),
177 [FormulaName.QUOTIENT]: new QUOTIENT(lookup, collateralLookup),
178 [FormulaName.RAND]: RAND.SELF,
179 [FormulaName.RANDBETWEEN]: new RANDBETWEEN(lookup, collateralLookup),
180 [FormulaName.SIGN]: new SIGN(lookup, collateralLookup),
181 [FormulaName.SIN]: new SIN(lookup, collateralLookup),
182 [FormulaName.SINH]: new SINH(lookup, collateralLookup),
183 [FormulaName.SQRT]: new SQRT(lookup, collateralLookup),
184 [FormulaName.SQRTPI]: new SQRTPI(lookup, collateralLookup),
185 [FormulaName.TAN]: new TAN(lookup, collateralLookup),
186 [FormulaName.TANH]: new TANH(lookup, collateralLookup),
187 [FormulaName.TO_TEXT]: new TO_TEXT(lookup, collateralLookup),
188 [FormulaName.TO_PERCENT]: new TO_PERCENT(lookup, collateralLookup),
189 [FormulaName.BIN2DEC]: new BIN2DEC(lookup, collateralLookup),
190 [FormulaName.BIN2HEX]: new BIN2HEX(lookup, collateralLookup),
191 [FormulaName.AVERAGE]: new AVERAGE(lookup, collateralLookup),
192 [FormulaName.AVERAGEA]: new AVERAGEA(lookup, collateralLookup),
193 [FormulaName.FLOOR]: new FLOOR(lookup, collateralLookup),
194 [FormulaName.DELTA]: new DELTA(lookup, collateralLookup),
195 [FormulaName.COUNT]: new COUNT(lookup, collateralLookup),
196 [FormulaName.COUNTA]: new COUNTA(lookup, collateralLookup),
197 [FormulaName.COUNTBLANK]: new COUNTBLANK(lookup, collateralLookup),
198 [FormulaName.MIN]: new MIN(lookup, collateralLookup),
199 [FormulaName.MINA]: new MINA(lookup, collateralLookup),
200 [FormulaName.MAX]: new MAX(lookup, collateralLookup),
201 [FormulaName.MAXA]: new MAXA(lookup, collateralLookup),
202 };
203 this.customFormulas = customFormulas || {};
204 }
205
206 hasFormulaBound(name: FormulaName | string) {
207 return name in this.formulas || name in this.customFormulas;
208 }
209
210 call(origin: SheetColumnRowKey, name: FormulaName | string, ...args: Array<Complex>): unknown {
211 if (name in this.formulas) {
212 return this.formulas[name].run(origin, ...args);
213 }
214 if (name in this.customFormulas) {
215 return (this.customFormulas[name] as any)(...args);
216 }
217 return new NameException(`Unknown formula: '${name.toString()}.`);
218 }
219}