f7
f7 is a spreadsheet formula execution library
git clone https://git.vogt.world/f7.git
Log | Files | README.md | LICENSE.md
← All files
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}