@ricsam/formula-engine 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +100 -0
- package/dist/cjs/core/ast-traverser.cjs +124 -0
- package/dist/cjs/core/ast-traverser.cjs.map +10 -0
- package/dist/cjs/core/autofill-utils.cjs +304 -0
- package/dist/cjs/core/autofill-utils.cjs.map +10 -0
- package/dist/cjs/core/engine.cjs +390 -0
- package/dist/cjs/core/engine.cjs.map +10 -0
- package/dist/cjs/core/managers/cache-manager.cjs +58 -0
- package/dist/cjs/core/managers/cache-manager.cjs.map +10 -0
- package/dist/cjs/core/managers/dependency-manager.cjs +620 -0
- package/dist/cjs/core/managers/dependency-manager.cjs.map +10 -0
- package/dist/cjs/core/managers/dependency-node.cjs +24 -0
- package/dist/cjs/core/managers/dependency-node.cjs.map +9 -0
- package/dist/cjs/core/managers/evaluation-manager.cjs +433 -0
- package/dist/cjs/core/managers/evaluation-manager.cjs.map +10 -0
- package/dist/cjs/core/managers/event-manager.cjs +49 -0
- package/dist/cjs/core/managers/event-manager.cjs.map +10 -0
- package/dist/cjs/core/managers/frontier-dependency-manager.cjs +181 -0
- package/dist/cjs/core/managers/frontier-dependency-manager.cjs.map +10 -0
- package/dist/cjs/core/managers/index.cjs +49 -0
- package/dist/cjs/core/managers/index.cjs.map +10 -0
- package/dist/cjs/core/managers/isDependencyNode.cjs +44 -0
- package/dist/cjs/core/managers/isDependencyNode.cjs.map +10 -0
- package/dist/cjs/core/managers/named-expression-manager.cjs +379 -0
- package/dist/cjs/core/managers/named-expression-manager.cjs.map +10 -0
- package/dist/cjs/core/managers/range-eval-order-builder.cjs +644 -0
- package/dist/cjs/core/managers/range-eval-order-builder.cjs.map +10 -0
- package/dist/cjs/core/managers/table-manager.cjs +254 -0
- package/dist/cjs/core/managers/table-manager.cjs.map +10 -0
- package/dist/cjs/core/managers/workbook-manager.cjs +474 -0
- package/dist/cjs/core/managers/workbook-manager.cjs.map +10 -0
- package/dist/cjs/core/map-serializer.cjs +69 -0
- package/dist/cjs/core/map-serializer.cjs.map +10 -0
- package/dist/cjs/core/named-expression-renamer.cjs +88 -0
- package/dist/cjs/core/named-expression-renamer.cjs.map +10 -0
- package/dist/cjs/core/sheet-renamer.cjs +89 -0
- package/dist/cjs/core/sheet-renamer.cjs.map +10 -0
- package/dist/cjs/core/sheet-utils.cjs +39 -0
- package/dist/cjs/core/sheet-utils.cjs.map +10 -0
- package/dist/cjs/core/table-renamer.cjs +88 -0
- package/dist/cjs/core/table-renamer.cjs.map +10 -0
- package/dist/cjs/core/types.cjs +48 -0
- package/dist/cjs/core/types.cjs.map +10 -0
- package/dist/cjs/core/utils/range-serializer.cjs +65 -0
- package/dist/cjs/core/utils/range-serializer.cjs.map +10 -0
- package/dist/cjs/core/utils/spreadsheet-visualizer.cjs +142 -0
- package/dist/cjs/core/utils/spreadsheet-visualizer.cjs.map +10 -0
- package/dist/cjs/core/utils.cjs +434 -0
- package/dist/cjs/core/utils.cjs.map +10 -0
- package/dist/cjs/core/workbook-renamer.cjs +106 -0
- package/dist/cjs/core/workbook-renamer.cjs.map +10 -0
- package/dist/cjs/debug/flags.cjs +47 -0
- package/dist/cjs/debug/flags.cjs.map +10 -0
- package/dist/cjs/evaluator/arithmetic/add/add.cjs +82 -0
- package/dist/cjs/evaluator/arithmetic/add/add.cjs.map +10 -0
- package/dist/cjs/evaluator/arithmetic/divide/divide.cjs +107 -0
- package/dist/cjs/evaluator/arithmetic/divide/divide.cjs.map +10 -0
- package/dist/cjs/evaluator/arithmetic/multiply/multiply.cjs +93 -0
- package/dist/cjs/evaluator/arithmetic/multiply/multiply.cjs.map +10 -0
- package/dist/cjs/evaluator/arithmetic/power/power.cjs +125 -0
- package/dist/cjs/evaluator/arithmetic/power/power.cjs.map +10 -0
- package/dist/cjs/evaluator/arithmetic/subtract/subtract.cjs +84 -0
- package/dist/cjs/evaluator/arithmetic/subtract/subtract.cjs.map +10 -0
- package/dist/cjs/evaluator/comparison/equals.cjs +64 -0
- package/dist/cjs/evaluator/comparison/equals.cjs.map +10 -0
- package/dist/cjs/evaluator/comparison/greater-than-or-equal.cjs +61 -0
- package/dist/cjs/evaluator/comparison/greater-than-or-equal.cjs.map +10 -0
- package/dist/cjs/evaluator/comparison/greater-than.cjs +61 -0
- package/dist/cjs/evaluator/comparison/greater-than.cjs.map +10 -0
- package/dist/cjs/evaluator/comparison/less-than-or-equal.cjs +69 -0
- package/dist/cjs/evaluator/comparison/less-than-or-equal.cjs.map +10 -0
- package/dist/cjs/evaluator/comparison/less-than.cjs +68 -0
- package/dist/cjs/evaluator/comparison/less-than.cjs.map +10 -0
- package/dist/cjs/evaluator/comparison/not-equals.cjs +53 -0
- package/dist/cjs/evaluator/comparison/not-equals.cjs.map +10 -0
- package/dist/cjs/evaluator/concatenation/concatenate.cjs +72 -0
- package/dist/cjs/evaluator/concatenation/concatenate.cjs.map +10 -0
- package/dist/cjs/evaluator/dependency-nodes/ast-evaluation-node.cjs +58 -0
- package/dist/cjs/evaluator/dependency-nodes/ast-evaluation-node.cjs.map +10 -0
- package/dist/cjs/evaluator/dependency-nodes/base-eval-node.cjs +112 -0
- package/dist/cjs/evaluator/dependency-nodes/base-eval-node.cjs.map +10 -0
- package/dist/cjs/evaluator/dependency-nodes/cell-value-node.cjs +54 -0
- package/dist/cjs/evaluator/dependency-nodes/cell-value-node.cjs.map +10 -0
- package/dist/cjs/evaluator/dependency-nodes/empty-cell-evaluation-node.cjs +108 -0
- package/dist/cjs/evaluator/dependency-nodes/empty-cell-evaluation-node.cjs.map +10 -0
- package/dist/cjs/evaluator/dependency-nodes/spill-meta-node.cjs +50 -0
- package/dist/cjs/evaluator/dependency-nodes/spill-meta-node.cjs.map +10 -0
- package/dist/cjs/evaluator/evaluate-scalar-operator.cjs +254 -0
- package/dist/cjs/evaluator/evaluate-scalar-operator.cjs.map +10 -0
- package/dist/cjs/evaluator/evaluation-context.cjs +154 -0
- package/dist/cjs/evaluator/evaluation-context.cjs.map +10 -0
- package/dist/cjs/evaluator/evaluation-error.cjs +75 -0
- package/dist/cjs/evaluator/evaluation-error.cjs.map +10 -0
- package/dist/cjs/evaluator/formula-evaluator.cjs +797 -0
- package/dist/cjs/evaluator/formula-evaluator.cjs.map +10 -0
- package/dist/cjs/evaluator/range-evaluation-node.cjs +88 -0
- package/dist/cjs/evaluator/range-evaluation-node.cjs.map +10 -0
- package/dist/cjs/functions/_template/template.cjs +42 -0
- package/dist/cjs/functions/_template/template.cjs.map +10 -0
- package/dist/cjs/functions/array/sequence/sequence.cjs +315 -0
- package/dist/cjs/functions/array/sequence/sequence.cjs.map +10 -0
- package/dist/cjs/functions/criteria-parser.cjs +217 -0
- package/dist/cjs/functions/criteria-parser.cjs.map +10 -0
- package/dist/cjs/functions/criteria-utils.cjs +291 -0
- package/dist/cjs/functions/criteria-utils.cjs.map +10 -0
- package/dist/cjs/functions/function-utils.cjs +63 -0
- package/dist/cjs/functions/function-utils.cjs.map +10 -0
- package/dist/cjs/functions/index.cjs +125 -0
- package/dist/cjs/functions/index.cjs.map +10 -0
- package/dist/cjs/functions/information/cell/cell.cjs +196 -0
- package/dist/cjs/functions/information/cell/cell.cjs.map +10 -0
- package/dist/cjs/functions/information/column/column.cjs +144 -0
- package/dist/cjs/functions/information/column/column.cjs.map +10 -0
- package/dist/cjs/functions/information/row/row.cjs +150 -0
- package/dist/cjs/functions/information/row/row.cjs.map +10 -0
- package/dist/cjs/functions/logical/and/and.cjs +112 -0
- package/dist/cjs/functions/logical/and/and.cjs.map +10 -0
- package/dist/cjs/functions/logical/if/if.cjs +195 -0
- package/dist/cjs/functions/logical/if/if.cjs.map +10 -0
- package/dist/cjs/functions/logical/iferror/iferror.cjs +126 -0
- package/dist/cjs/functions/logical/iferror/iferror.cjs.map +10 -0
- package/dist/cjs/functions/logical/or/or.cjs +112 -0
- package/dist/cjs/functions/logical/or/or.cjs.map +10 -0
- package/dist/cjs/functions/lookup/count/count-utils.cjs +65 -0
- package/dist/cjs/functions/lookup/count/count-utils.cjs.map +10 -0
- package/dist/cjs/functions/lookup/count/count.cjs +48 -0
- package/dist/cjs/functions/lookup/count/count.cjs.map +10 -0
- package/dist/cjs/functions/lookup/count/countif.cjs +94 -0
- package/dist/cjs/functions/lookup/count/countif.cjs.map +10 -0
- package/dist/cjs/functions/lookup/count/countifs.cjs +63 -0
- package/dist/cjs/functions/lookup/count/countifs.cjs.map +10 -0
- package/dist/cjs/functions/lookup/index-lookup/index-lookup.cjs +187 -0
- package/dist/cjs/functions/lookup/index-lookup/index-lookup.cjs.map +10 -0
- package/dist/cjs/functions/lookup/match/match.cjs +168 -0
- package/dist/cjs/functions/lookup/match/match.cjs.map +10 -0
- package/dist/cjs/functions/lookup/xlookup/xlookup.cjs +410 -0
- package/dist/cjs/functions/lookup/xlookup/xlookup.cjs.map +10 -0
- package/dist/cjs/functions/math/average/average-utils.cjs +72 -0
- package/dist/cjs/functions/math/average/average-utils.cjs.map +10 -0
- package/dist/cjs/functions/math/average/average.cjs +48 -0
- package/dist/cjs/functions/math/average/average.cjs.map +10 -0
- package/dist/cjs/functions/math/average/averageif.cjs +83 -0
- package/dist/cjs/functions/math/average/averageif.cjs.map +10 -0
- package/dist/cjs/functions/math/average/averageifs.cjs +61 -0
- package/dist/cjs/functions/math/average/averageifs.cjs.map +10 -0
- package/dist/cjs/functions/math/ceiling/ceiling.cjs +219 -0
- package/dist/cjs/functions/math/ceiling/ceiling.cjs.map +10 -0
- package/dist/cjs/functions/math/max/max-utils.cjs +71 -0
- package/dist/cjs/functions/math/max/max-utils.cjs.map +10 -0
- package/dist/cjs/functions/math/max/max.cjs +48 -0
- package/dist/cjs/functions/math/max/max.cjs.map +10 -0
- package/dist/cjs/functions/math/max/maxif.cjs +83 -0
- package/dist/cjs/functions/math/max/maxif.cjs.map +10 -0
- package/dist/cjs/functions/math/max/maxifs.cjs +61 -0
- package/dist/cjs/functions/math/max/maxifs.cjs.map +10 -0
- package/dist/cjs/functions/math/min/min-utils.cjs +71 -0
- package/dist/cjs/functions/math/min/min-utils.cjs.map +10 -0
- package/dist/cjs/functions/math/min/min.cjs +48 -0
- package/dist/cjs/functions/math/min/min.cjs.map +10 -0
- package/dist/cjs/functions/math/min/minif.cjs +83 -0
- package/dist/cjs/functions/math/min/minif.cjs.map +10 -0
- package/dist/cjs/functions/math/min/minifs.cjs +61 -0
- package/dist/cjs/functions/math/min/minifs.cjs.map +10 -0
- package/dist/cjs/functions/math/sum/sum.cjs +48 -0
- package/dist/cjs/functions/math/sum/sum.cjs.map +10 -0
- package/dist/cjs/functions/math/sum/sumif.cjs +83 -0
- package/dist/cjs/functions/math/sum/sumif.cjs.map +10 -0
- package/dist/cjs/functions/math/sum/sumifs.cjs +60 -0
- package/dist/cjs/functions/math/sum/sumifs.cjs.map +10 -0
- package/dist/cjs/functions/math/sum/summation-utils.cjs +57 -0
- package/dist/cjs/functions/math/sum/summation-utils.cjs.map +10 -0
- package/dist/cjs/functions/reference/address/address.cjs +163 -0
- package/dist/cjs/functions/reference/address/address.cjs.map +10 -0
- package/dist/cjs/functions/reference/indirect/indirect.cjs +102 -0
- package/dist/cjs/functions/reference/indirect/indirect.cjs.map +10 -0
- package/dist/cjs/functions/reference/offset/offset.cjs +233 -0
- package/dist/cjs/functions/reference/offset/offset.cjs.map +10 -0
- package/dist/cjs/functions/text/concatenate/concatenate.cjs +167 -0
- package/dist/cjs/functions/text/concatenate/concatenate.cjs.map +10 -0
- package/dist/cjs/functions/text/exact/exact.cjs +171 -0
- package/dist/cjs/functions/text/exact/exact.cjs.map +10 -0
- package/dist/cjs/functions/text/find/find.cjs +397 -0
- package/dist/cjs/functions/text/find/find.cjs.map +10 -0
- package/dist/cjs/functions/text/left/left.cjs +109 -0
- package/dist/cjs/functions/text/left/left.cjs.map +10 -0
- package/dist/cjs/functions/text/len/len.cjs +119 -0
- package/dist/cjs/functions/text/len/len.cjs.map +10 -0
- package/dist/cjs/functions/text/mid/mid.cjs +103 -0
- package/dist/cjs/functions/text/mid/mid.cjs.map +10 -0
- package/dist/cjs/functions/text/right/right.cjs +167 -0
- package/dist/cjs/functions/text/right/right.cjs.map +10 -0
- package/dist/cjs/functions/text/text-helpers.cjs +179 -0
- package/dist/cjs/functions/text/text-helpers.cjs.map +10 -0
- package/dist/cjs/functions/text/textjoin/textjoin.cjs +173 -0
- package/dist/cjs/functions/text/textjoin/textjoin.cjs.map +10 -0
- package/dist/cjs/package.json +5 -0
- package/dist/cjs/parser/ast.cjs +175 -0
- package/dist/cjs/parser/ast.cjs.map +10 -0
- package/dist/cjs/parser/formatter.cjs +319 -0
- package/dist/cjs/parser/formatter.cjs.map +10 -0
- package/dist/cjs/parser/grammar.cjs +375 -0
- package/dist/cjs/parser/grammar.cjs.map +10 -0
- package/dist/cjs/parser/lexer.cjs +443 -0
- package/dist/cjs/parser/lexer.cjs.map +10 -0
- package/dist/cjs/parser/parser.cjs +1700 -0
- package/dist/cjs/parser/parser.cjs.map +10 -0
- package/dist/cjs/react/hooks.cjs +59 -0
- package/dist/cjs/react/hooks.cjs.map +10 -0
- package/dist/mjs/core/ast-traverser.mjs +94 -0
- package/dist/mjs/core/ast-traverser.mjs.map +10 -0
- package/dist/mjs/core/autofill-utils.mjs +274 -0
- package/dist/mjs/core/autofill-utils.mjs.map +10 -0
- package/dist/mjs/core/engine.mjs +366 -0
- package/dist/mjs/core/engine.mjs.map +10 -0
- package/dist/mjs/core/managers/cache-manager.mjs +27 -0
- package/dist/mjs/core/managers/cache-manager.mjs.map +10 -0
- package/dist/mjs/core/managers/dependency-manager.mjs +593 -0
- package/dist/mjs/core/managers/dependency-manager.mjs.map +10 -0
- package/dist/mjs/core/managers/dependency-node.mjs +2 -0
- package/dist/mjs/core/managers/dependency-node.mjs.map +9 -0
- package/dist/mjs/core/managers/evaluation-manager.mjs +415 -0
- package/dist/mjs/core/managers/evaluation-manager.mjs.map +10 -0
- package/dist/mjs/core/managers/event-manager.mjs +18 -0
- package/dist/mjs/core/managers/event-manager.mjs.map +10 -0
- package/dist/mjs/core/managers/frontier-dependency-manager.mjs +151 -0
- package/dist/mjs/core/managers/frontier-dependency-manager.mjs.map +10 -0
- package/dist/mjs/core/managers/index.mjs +21 -0
- package/dist/mjs/core/managers/index.mjs.map +10 -0
- package/dist/mjs/core/managers/isDependencyNode.mjs +14 -0
- package/dist/mjs/core/managers/isDependencyNode.mjs.map +10 -0
- package/dist/mjs/core/managers/named-expression-manager.mjs +348 -0
- package/dist/mjs/core/managers/named-expression-manager.mjs.map +10 -0
- package/dist/mjs/core/managers/range-eval-order-builder.mjs +618 -0
- package/dist/mjs/core/managers/range-eval-order-builder.mjs.map +10 -0
- package/dist/mjs/core/managers/table-manager.mjs +224 -0
- package/dist/mjs/core/managers/table-manager.mjs.map +10 -0
- package/dist/mjs/core/managers/workbook-manager.mjs +447 -0
- package/dist/mjs/core/managers/workbook-manager.mjs.map +10 -0
- package/dist/mjs/core/map-serializer.mjs +39 -0
- package/dist/mjs/core/map-serializer.mjs.map +10 -0
- package/dist/mjs/core/named-expression-renamer.mjs +58 -0
- package/dist/mjs/core/named-expression-renamer.mjs.map +10 -0
- package/dist/mjs/core/sheet-renamer.mjs +59 -0
- package/dist/mjs/core/sheet-renamer.mjs.map +10 -0
- package/dist/mjs/core/sheet-utils.mjs +8 -0
- package/dist/mjs/core/sheet-utils.mjs.map +10 -0
- package/dist/mjs/core/table-renamer.mjs +58 -0
- package/dist/mjs/core/table-renamer.mjs.map +10 -0
- package/dist/mjs/core/types.mjs +18 -0
- package/dist/mjs/core/types.mjs.map +10 -0
- package/dist/mjs/core/utils/range-serializer.mjs +35 -0
- package/dist/mjs/core/utils/range-serializer.mjs.map +10 -0
- package/dist/mjs/core/utils/spreadsheet-visualizer.mjs +112 -0
- package/dist/mjs/core/utils/spreadsheet-visualizer.mjs.map +10 -0
- package/dist/mjs/core/utils.mjs +409 -0
- package/dist/mjs/core/utils.mjs.map +10 -0
- package/dist/mjs/core/workbook-renamer.mjs +76 -0
- package/dist/mjs/core/workbook-renamer.mjs.map +10 -0
- package/dist/mjs/debug/flags.mjs +17 -0
- package/dist/mjs/debug/flags.mjs.map +10 -0
- package/dist/mjs/evaluator/arithmetic/add/add.mjs +52 -0
- package/dist/mjs/evaluator/arithmetic/add/add.mjs.map +10 -0
- package/dist/mjs/evaluator/arithmetic/divide/divide.mjs +77 -0
- package/dist/mjs/evaluator/arithmetic/divide/divide.mjs.map +10 -0
- package/dist/mjs/evaluator/arithmetic/multiply/multiply.mjs +63 -0
- package/dist/mjs/evaluator/arithmetic/multiply/multiply.mjs.map +10 -0
- package/dist/mjs/evaluator/arithmetic/power/power.mjs +95 -0
- package/dist/mjs/evaluator/arithmetic/power/power.mjs.map +10 -0
- package/dist/mjs/evaluator/arithmetic/subtract/subtract.mjs +54 -0
- package/dist/mjs/evaluator/arithmetic/subtract/subtract.mjs.map +10 -0
- package/dist/mjs/evaluator/comparison/equals.mjs +34 -0
- package/dist/mjs/evaluator/comparison/equals.mjs.map +10 -0
- package/dist/mjs/evaluator/comparison/greater-than-or-equal.mjs +31 -0
- package/dist/mjs/evaluator/comparison/greater-than-or-equal.mjs.map +10 -0
- package/dist/mjs/evaluator/comparison/greater-than.mjs +31 -0
- package/dist/mjs/evaluator/comparison/greater-than.mjs.map +10 -0
- package/dist/mjs/evaluator/comparison/less-than-or-equal.mjs +39 -0
- package/dist/mjs/evaluator/comparison/less-than-or-equal.mjs.map +10 -0
- package/dist/mjs/evaluator/comparison/less-than.mjs +38 -0
- package/dist/mjs/evaluator/comparison/less-than.mjs.map +10 -0
- package/dist/mjs/evaluator/comparison/not-equals.mjs +23 -0
- package/dist/mjs/evaluator/comparison/not-equals.mjs.map +10 -0
- package/dist/mjs/evaluator/concatenation/concatenate.mjs +42 -0
- package/dist/mjs/evaluator/concatenation/concatenate.mjs.map +10 -0
- package/dist/mjs/evaluator/dependency-nodes/ast-evaluation-node.mjs +28 -0
- package/dist/mjs/evaluator/dependency-nodes/ast-evaluation-node.mjs.map +10 -0
- package/dist/mjs/evaluator/dependency-nodes/base-eval-node.mjs +81 -0
- package/dist/mjs/evaluator/dependency-nodes/base-eval-node.mjs.map +10 -0
- package/dist/mjs/evaluator/dependency-nodes/cell-value-node.mjs +24 -0
- package/dist/mjs/evaluator/dependency-nodes/cell-value-node.mjs.map +10 -0
- package/dist/mjs/evaluator/dependency-nodes/empty-cell-evaluation-node.mjs +78 -0
- package/dist/mjs/evaluator/dependency-nodes/empty-cell-evaluation-node.mjs.map +10 -0
- package/dist/mjs/evaluator/dependency-nodes/spill-meta-node.mjs +20 -0
- package/dist/mjs/evaluator/dependency-nodes/spill-meta-node.mjs.map +10 -0
- package/dist/mjs/evaluator/evaluate-scalar-operator.mjs +226 -0
- package/dist/mjs/evaluator/evaluate-scalar-operator.mjs.map +10 -0
- package/dist/mjs/evaluator/evaluation-context.mjs +123 -0
- package/dist/mjs/evaluator/evaluation-context.mjs.map +10 -0
- package/dist/mjs/evaluator/evaluation-error.mjs +44 -0
- package/dist/mjs/evaluator/evaluation-error.mjs.map +10 -0
- package/dist/mjs/evaluator/formula-evaluator.mjs +780 -0
- package/dist/mjs/evaluator/formula-evaluator.mjs.map +10 -0
- package/dist/mjs/evaluator/range-evaluation-node.mjs +58 -0
- package/dist/mjs/evaluator/range-evaluation-node.mjs.map +10 -0
- package/dist/mjs/functions/_template/template.mjs +12 -0
- package/dist/mjs/functions/_template/template.mjs.map +10 -0
- package/dist/mjs/functions/array/sequence/sequence.mjs +287 -0
- package/dist/mjs/functions/array/sequence/sequence.mjs.map +10 -0
- package/dist/mjs/functions/criteria-parser.mjs +187 -0
- package/dist/mjs/functions/criteria-parser.mjs.map +10 -0
- package/dist/mjs/functions/criteria-utils.mjs +268 -0
- package/dist/mjs/functions/criteria-utils.mjs.map +10 -0
- package/dist/mjs/functions/function-utils.mjs +33 -0
- package/dist/mjs/functions/function-utils.mjs.map +10 -0
- package/dist/mjs/functions/index.mjs +95 -0
- package/dist/mjs/functions/index.mjs.map +10 -0
- package/dist/mjs/functions/information/cell/cell.mjs +168 -0
- package/dist/mjs/functions/information/cell/cell.mjs.map +10 -0
- package/dist/mjs/functions/information/column/column.mjs +120 -0
- package/dist/mjs/functions/information/column/column.mjs.map +10 -0
- package/dist/mjs/functions/information/row/row.mjs +126 -0
- package/dist/mjs/functions/information/row/row.mjs.map +10 -0
- package/dist/mjs/functions/logical/and/and.mjs +84 -0
- package/dist/mjs/functions/logical/and/and.mjs.map +10 -0
- package/dist/mjs/functions/logical/if/if.mjs +167 -0
- package/dist/mjs/functions/logical/if/if.mjs.map +10 -0
- package/dist/mjs/functions/logical/iferror/iferror.mjs +98 -0
- package/dist/mjs/functions/logical/iferror/iferror.mjs.map +10 -0
- package/dist/mjs/functions/logical/or/or.mjs +84 -0
- package/dist/mjs/functions/logical/or/or.mjs.map +10 -0
- package/dist/mjs/functions/lookup/count/count-utils.mjs +35 -0
- package/dist/mjs/functions/lookup/count/count-utils.mjs.map +10 -0
- package/dist/mjs/functions/lookup/count/count.mjs +18 -0
- package/dist/mjs/functions/lookup/count/count.mjs.map +10 -0
- package/dist/mjs/functions/lookup/count/countif.mjs +68 -0
- package/dist/mjs/functions/lookup/count/countif.mjs.map +10 -0
- package/dist/mjs/functions/lookup/count/countifs.mjs +37 -0
- package/dist/mjs/functions/lookup/count/countifs.mjs.map +10 -0
- package/dist/mjs/functions/lookup/index-lookup/index-lookup.mjs +159 -0
- package/dist/mjs/functions/lookup/index-lookup/index-lookup.mjs.map +10 -0
- package/dist/mjs/functions/lookup/match/match.mjs +140 -0
- package/dist/mjs/functions/lookup/match/match.mjs.map +10 -0
- package/dist/mjs/functions/lookup/xlookup/xlookup.mjs +382 -0
- package/dist/mjs/functions/lookup/xlookup/xlookup.mjs.map +10 -0
- package/dist/mjs/functions/math/average/average-utils.mjs +44 -0
- package/dist/mjs/functions/math/average/average-utils.mjs.map +10 -0
- package/dist/mjs/functions/math/average/average.mjs +18 -0
- package/dist/mjs/functions/math/average/average.mjs.map +10 -0
- package/dist/mjs/functions/math/average/averageif.mjs +58 -0
- package/dist/mjs/functions/math/average/averageif.mjs.map +10 -0
- package/dist/mjs/functions/math/average/averageifs.mjs +35 -0
- package/dist/mjs/functions/math/average/averageifs.mjs.map +10 -0
- package/dist/mjs/functions/math/ceiling/ceiling.mjs +191 -0
- package/dist/mjs/functions/math/ceiling/ceiling.mjs.map +10 -0
- package/dist/mjs/functions/math/max/max-utils.mjs +43 -0
- package/dist/mjs/functions/math/max/max-utils.mjs.map +10 -0
- package/dist/mjs/functions/math/max/max.mjs +18 -0
- package/dist/mjs/functions/math/max/max.mjs.map +10 -0
- package/dist/mjs/functions/math/max/maxif.mjs +58 -0
- package/dist/mjs/functions/math/max/maxif.mjs.map +10 -0
- package/dist/mjs/functions/math/max/maxifs.mjs +35 -0
- package/dist/mjs/functions/math/max/maxifs.mjs.map +10 -0
- package/dist/mjs/functions/math/min/min-utils.mjs +43 -0
- package/dist/mjs/functions/math/min/min-utils.mjs.map +10 -0
- package/dist/mjs/functions/math/min/min.mjs +18 -0
- package/dist/mjs/functions/math/min/min.mjs.map +10 -0
- package/dist/mjs/functions/math/min/minif.mjs +58 -0
- package/dist/mjs/functions/math/min/minif.mjs.map +10 -0
- package/dist/mjs/functions/math/min/minifs.mjs +35 -0
- package/dist/mjs/functions/math/min/minifs.mjs.map +10 -0
- package/dist/mjs/functions/math/sum/sum.mjs +18 -0
- package/dist/mjs/functions/math/sum/sum.mjs.map +10 -0
- package/dist/mjs/functions/math/sum/sumif.mjs +58 -0
- package/dist/mjs/functions/math/sum/sumif.mjs.map +10 -0
- package/dist/mjs/functions/math/sum/sumifs.mjs +34 -0
- package/dist/mjs/functions/math/sum/sumifs.mjs.map +10 -0
- package/dist/mjs/functions/math/sum/summation-utils.mjs +27 -0
- package/dist/mjs/functions/math/sum/summation-utils.mjs.map +10 -0
- package/dist/mjs/functions/reference/address/address.mjs +135 -0
- package/dist/mjs/functions/reference/address/address.mjs.map +10 -0
- package/dist/mjs/functions/reference/indirect/indirect.mjs +74 -0
- package/dist/mjs/functions/reference/indirect/indirect.mjs.map +10 -0
- package/dist/mjs/functions/reference/offset/offset.mjs +205 -0
- package/dist/mjs/functions/reference/offset/offset.mjs.map +10 -0
- package/dist/mjs/functions/text/concatenate/concatenate.mjs +139 -0
- package/dist/mjs/functions/text/concatenate/concatenate.mjs.map +10 -0
- package/dist/mjs/functions/text/exact/exact.mjs +143 -0
- package/dist/mjs/functions/text/exact/exact.mjs.map +10 -0
- package/dist/mjs/functions/text/find/find.mjs +369 -0
- package/dist/mjs/functions/text/find/find.mjs.map +10 -0
- package/dist/mjs/functions/text/left/left.mjs +81 -0
- package/dist/mjs/functions/text/left/left.mjs.map +10 -0
- package/dist/mjs/functions/text/len/len.mjs +91 -0
- package/dist/mjs/functions/text/len/len.mjs.map +10 -0
- package/dist/mjs/functions/text/mid/mid.mjs +75 -0
- package/dist/mjs/functions/text/mid/mid.mjs.map +10 -0
- package/dist/mjs/functions/text/right/right.mjs +143 -0
- package/dist/mjs/functions/text/right/right.mjs.map +10 -0
- package/dist/mjs/functions/text/text-helpers.mjs +151 -0
- package/dist/mjs/functions/text/text-helpers.mjs.map +10 -0
- package/dist/mjs/functions/text/textjoin/textjoin.mjs +145 -0
- package/dist/mjs/functions/text/textjoin/textjoin.mjs.map +10 -0
- package/dist/mjs/package.json +5 -0
- package/dist/mjs/parser/ast.mjs +145 -0
- package/dist/mjs/parser/ast.mjs.map +10 -0
- package/dist/mjs/parser/formatter.mjs +289 -0
- package/dist/mjs/parser/formatter.mjs.map +10 -0
- package/dist/mjs/parser/grammar.mjs +345 -0
- package/dist/mjs/parser/grammar.mjs.map +10 -0
- package/dist/mjs/parser/lexer.mjs +412 -0
- package/dist/mjs/parser/lexer.mjs.map +10 -0
- package/dist/mjs/parser/parser.mjs +1692 -0
- package/dist/mjs/parser/parser.mjs.map +10 -0
- package/dist/mjs/react/hooks.mjs +16 -0
- package/dist/mjs/react/hooks.mjs.map +10 -0
- package/dist/types/core/ast-traverser.d.ts +28 -0
- package/dist/types/core/autofill-utils.d.ts +32 -0
- package/dist/types/core/engine.d.ts +184 -0
- package/dist/types/core/managers/cache-manager.d.ts +14 -0
- package/dist/types/core/managers/dependency-manager.d.ts +147 -0
- package/dist/types/core/managers/dependency-node.d.ts +13 -0
- package/dist/types/core/managers/evaluation-manager.d.ts +30 -0
- package/dist/types/core/managers/event-manager.d.ts +8 -0
- package/dist/types/core/managers/frontier-dependency-manager.d.ts +69 -0
- package/dist/types/core/managers/index.d.ts +7 -0
- package/dist/types/core/managers/isDependencyNode.d.ts +2 -0
- package/dist/types/core/managers/named-expression-manager.d.ts +101 -0
- package/dist/types/core/managers/range-eval-order-builder.d.ts +33 -0
- package/dist/types/core/managers/table-manager.d.ts +84 -0
- package/dist/types/core/managers/workbook-manager.d.ts +136 -0
- package/dist/types/core/map-serializer.d.ts +4 -0
- package/dist/types/core/named-expression-renamer.d.ts +21 -0
- package/dist/types/core/sheet-renamer.d.ts +28 -0
- package/dist/types/core/sheet-utils.d.ts +2 -0
- package/dist/types/core/table-renamer.d.ts +21 -0
- package/dist/types/core/types.d.ts +272 -0
- package/dist/types/core/utils/cell-address-parsing.test.d.ts +1 -0
- package/dist/types/core/utils/range-serializer.d.ts +22 -0
- package/dist/types/core/utils/range-serializer.test.d.ts +1 -0
- package/dist/types/core/utils/spreadsheet-visualizer.d.ts +30 -0
- package/dist/types/core/utils.d.ts +48 -0
- package/dist/types/core/workbook-renamer.d.ts +28 -0
- package/dist/types/debug/flags.d.ts +11 -0
- package/dist/types/evaluator/arithmetic/add/add.d.ts +2 -0
- package/dist/types/evaluator/arithmetic/add/add.test.d.ts +1 -0
- package/dist/types/evaluator/arithmetic/divide/divide.d.ts +2 -0
- package/dist/types/evaluator/arithmetic/divide/divide.test.d.ts +1 -0
- package/dist/types/evaluator/arithmetic/multiply/multiply.d.ts +2 -0
- package/dist/types/evaluator/arithmetic/multiply/multiply.test.d.ts +1 -0
- package/dist/types/evaluator/arithmetic/power/power.d.ts +2 -0
- package/dist/types/evaluator/arithmetic/power/power.test.d.ts +1 -0
- package/dist/types/evaluator/arithmetic/subtract/subtract.d.ts +2 -0
- package/dist/types/evaluator/arithmetic/subtract/subtract.test.d.ts +1 -0
- package/dist/types/evaluator/comparison/comparison-operators.test.d.ts +1 -0
- package/dist/types/evaluator/comparison/equals.d.ts +6 -0
- package/dist/types/evaluator/comparison/greater-than-or-equal.d.ts +6 -0
- package/dist/types/evaluator/comparison/greater-than.d.ts +6 -0
- package/dist/types/evaluator/comparison/less-than-or-equal.d.ts +6 -0
- package/dist/types/evaluator/comparison/less-than.d.ts +6 -0
- package/dist/types/evaluator/comparison/not-equals.d.ts +6 -0
- package/dist/types/evaluator/concatenation/concatenate.d.ts +6 -0
- package/dist/types/evaluator/concatenation/concatenate.test.d.ts +1 -0
- package/dist/types/evaluator/dependency-nodes/ast-evaluation-node.d.ts +12 -0
- package/dist/types/evaluator/dependency-nodes/base-eval-node.d.ts +31 -0
- package/dist/types/evaluator/dependency-nodes/cell-value-node.d.ts +10 -0
- package/dist/types/evaluator/dependency-nodes/empty-cell-evaluation-node.d.ts +17 -0
- package/dist/types/evaluator/dependency-nodes/spill-meta-node.d.ts +7 -0
- package/dist/types/evaluator/evaluate-scalar-operator.d.ts +12 -0
- package/dist/types/evaluator/evaluation-context.d.ts +66 -0
- package/dist/types/evaluator/evaluation-error.d.ts +20 -0
- package/dist/types/evaluator/formula-evaluator.d.ts +67 -0
- package/dist/types/evaluator/open-range-evaluator.test.d.ts +1 -0
- package/dist/types/evaluator/range-evaluation-node.d.ts +16 -0
- package/dist/types/functions/_template/template.d.ts +5 -0
- package/dist/types/functions/_template/template.test.d.ts +1 -0
- package/dist/types/functions/array/sequence/performance-test.d.ts +1 -0
- package/dist/types/functions/array/sequence/sequence.d.ts +14 -0
- package/dist/types/functions/array/sequence/sequence.test.d.ts +1 -0
- package/dist/types/functions/criteria-parser.d.ts +27 -0
- package/dist/types/functions/criteria-utils.d.ts +61 -0
- package/dist/types/functions/function-utils.d.ts +21 -0
- package/dist/types/functions/index.d.ts +2 -0
- package/dist/types/functions/information/cell/cell.d.ts +24 -0
- package/dist/types/functions/information/cell/cell.test.d.ts +1 -0
- package/dist/types/functions/information/column/column.d.ts +14 -0
- package/dist/types/functions/information/column/column.test.d.ts +1 -0
- package/dist/types/functions/information/row/row.d.ts +14 -0
- package/dist/types/functions/information/row/row.test.d.ts +1 -0
- package/dist/types/functions/logical/and/and.d.ts +5 -0
- package/dist/types/functions/logical/and/and.test.d.ts +1 -0
- package/dist/types/functions/logical/if/if.d.ts +5 -0
- package/dist/types/functions/logical/if/if.test.d.ts +1 -0
- package/dist/types/functions/logical/iferror/iferror.d.ts +5 -0
- package/dist/types/functions/logical/iferror/iferror.test.d.ts +1 -0
- package/dist/types/functions/logical/or/or.d.ts +5 -0
- package/dist/types/functions/logical/or/or.test.d.ts +1 -0
- package/dist/types/functions/lookup/count/count-utils.d.ts +14 -0
- package/dist/types/functions/lookup/count/count.d.ts +21 -0
- package/dist/types/functions/lookup/count/count.test.d.ts +1 -0
- package/dist/types/functions/lookup/count/countif.d.ts +26 -0
- package/dist/types/functions/lookup/count/countif.test.d.ts +1 -0
- package/dist/types/functions/lookup/count/countifs.d.ts +21 -0
- package/dist/types/functions/lookup/count/countifs.test.d.ts +1 -0
- package/dist/types/functions/lookup/index-lookup/index-lookup.d.ts +2 -0
- package/dist/types/functions/lookup/index-lookup/index-lookup.test.d.ts +1 -0
- package/dist/types/functions/lookup/match/match.d.ts +2 -0
- package/dist/types/functions/lookup/match/match.test.d.ts +1 -0
- package/dist/types/functions/lookup/xlookup/xlookup.d.ts +2 -0
- package/dist/types/functions/lookup/xlookup/xlookup.test.d.ts +1 -0
- package/dist/types/functions/math/average/average-utils.d.ts +10 -0
- package/dist/types/functions/math/average/average.d.ts +18 -0
- package/dist/types/functions/math/average/average.test.d.ts +1 -0
- package/dist/types/functions/math/average/averageif.d.ts +23 -0
- package/dist/types/functions/math/average/averageif.test.d.ts +1 -0
- package/dist/types/functions/math/average/averageifs.d.ts +21 -0
- package/dist/types/functions/math/average/averageifs.test.d.ts +1 -0
- package/dist/types/functions/math/ceiling/ceiling.d.ts +5 -0
- package/dist/types/functions/math/ceiling/ceiling.test.d.ts +1 -0
- package/dist/types/functions/math/max/max-utils.d.ts +20 -0
- package/dist/types/functions/math/max/max.d.ts +18 -0
- package/dist/types/functions/math/max/max.test.d.ts +1 -0
- package/dist/types/functions/math/max/maxif.d.ts +23 -0
- package/dist/types/functions/math/max/maxif.test.d.ts +1 -0
- package/dist/types/functions/math/max/maxifs.d.ts +21 -0
- package/dist/types/functions/math/max/maxifs.test.d.ts +1 -0
- package/dist/types/functions/math/min/min-utils.d.ts +20 -0
- package/dist/types/functions/math/min/min.d.ts +5 -0
- package/dist/types/functions/math/min/min.test.d.ts +1 -0
- package/dist/types/functions/math/min/minif.d.ts +23 -0
- package/dist/types/functions/math/min/minif.test.d.ts +1 -0
- package/dist/types/functions/math/min/minifs.d.ts +21 -0
- package/dist/types/functions/math/min/minifs.test.d.ts +1 -0
- package/dist/types/functions/math/sum/sum.d.ts +5 -0
- package/dist/types/functions/math/sum/sum.test.d.ts +1 -0
- package/dist/types/functions/math/sum/sumif.d.ts +23 -0
- package/dist/types/functions/math/sum/sumif.test.d.ts +1 -0
- package/dist/types/functions/math/sum/sumifs.d.ts +21 -0
- package/dist/types/functions/math/sum/sumifs.test.d.ts +1 -0
- package/dist/types/functions/math/sum/summation-utils.d.ts +19 -0
- package/dist/types/functions/reference/address/address.d.ts +18 -0
- package/dist/types/functions/reference/address/address.test.d.ts +1 -0
- package/dist/types/functions/reference/indirect/indirect.d.ts +20 -0
- package/dist/types/functions/reference/indirect/indirect.test.d.ts +1 -0
- package/dist/types/functions/reference/offset/offset.d.ts +23 -0
- package/dist/types/functions/reference/offset/offset.test.d.ts +1 -0
- package/dist/types/functions/text/concatenate/concatenate.d.ts +5 -0
- package/dist/types/functions/text/concatenate/concatenate.test.d.ts +1 -0
- package/dist/types/functions/text/exact/exact.d.ts +5 -0
- package/dist/types/functions/text/exact/exact.test.d.ts +1 -0
- package/dist/types/functions/text/find/find.d.ts +20 -0
- package/dist/types/functions/text/find/find.test.d.ts +1 -0
- package/dist/types/functions/text/left/left.d.ts +19 -0
- package/dist/types/functions/text/left/left.test.d.ts +1 -0
- package/dist/types/functions/text/len/len.d.ts +16 -0
- package/dist/types/functions/text/len/len.test.d.ts +1 -0
- package/dist/types/functions/text/mid/mid.d.ts +20 -0
- package/dist/types/functions/text/mid/mid.test.d.ts +1 -0
- package/dist/types/functions/text/right/right.d.ts +2 -0
- package/dist/types/functions/text/right/right.test.d.ts +1 -0
- package/dist/types/functions/text/text-helpers.d.ts +27 -0
- package/dist/types/functions/text/textjoin/textjoin.d.ts +5 -0
- package/dist/types/functions/text/textjoin/textjoin.test.d.ts +1 -0
- package/dist/types/parser/ast.d.ts +275 -0
- package/dist/types/parser/formatter.d.ts +6 -0
- package/dist/types/parser/grammar.d.ts +203 -0
- package/dist/types/parser/lexer.d.ts +144 -0
- package/dist/types/parser/parser.d.ts +159 -0
- package/dist/types/react/hooks.d.ts +5 -0
- package/package.json +41 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/functions/math/average/averageifs.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import {\n type FunctionDefinition,\n type FunctionEvaluationResult,\n} from \"src/core/types\";\nimport type { EvaluationContext } from \"src/evaluator/evaluation-context\";\nimport {\n parseCriteriaPairs,\n processMultiCriteriaValues,\n validateMultiCriteriaArgs,\n} from \"../../criteria-utils.mjs\";\nimport { performAverage } from \"./average-utils.mjs\";\n\n/**\n * AVERAGEIFS function - Calculates the average of cells in a range that meet multiple criteria\n *\n * Usage: AVERAGEIFS(average_range, criteria_range1, criteria1, [criteria_range2, criteria2], ...)\n *\n * average_range: The range of cells to average\n * criteria_range1: The first range to evaluate against criteria1\n * criteria1: The first criteria to match against\n * criteria_range2, criteria2: Optional additional criteria pairs\n *\n * Examples:\n * AVERAGEIFS(B1:B10, A1:A10, \"Apple\") - averages B1:B10 where A1:A10 = \"Apple\"\n * AVERAGEIFS(C1:C10, A1:A10, \"Apple\", B1:B10, \">10\") - averages C1:C10 where A1:A10 = \"Apple\" AND B1:B10 > 10\n *\n * Note:\n * - All criteria must be satisfied for a value to be included\n * - Only numeric values are included in the average calculation\n * - Returns error if no values match all criteria\n */\nexport const AVERAGEIFS: FunctionDefinition = {\n name: \"AVERAGEIFS\",\n evaluate: function (node, context): FunctionEvaluationResult {\n // Validate arguments using utility\n const argError = validateMultiCriteriaArgs(\"AVERAGEIFS\", node.args.length, context);\n if (argError) {\n return argError;\n }\n\n // Evaluate average range\n const averageRangeResult = this.evaluateNode(node.args[0]!, context);\n if (averageRangeResult.type === \"error\") {\n return averageRangeResult;\n }\n\n // Parse criteria pairs using utility\n const criteriaPairsResult = parseCriteriaPairs.call(\n this,\n node,\n context,\n this.evaluateNode,\n 1\n );\n if (\"type\" in criteriaPairsResult) {\n return criteriaPairsResult;\n }\n const criteriaPairs = criteriaPairsResult;\n\n // Use shared average utility for standard cases\n const matchingValues = processMultiCriteriaValues(\n this,\n averageRangeResult,\n criteriaPairs,\n context,\n \"col-major\"\n );\n\n if (matchingValues.type === \"error\" || matchingValues.type === \"awaiting-evaluation\") {\n return matchingValues;\n }\n\n return performAverage(matchingValues.values, context);\n },\n};\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";AAKA;AAAA;AAAA;AAAA;AAAA;AAKA;AAqBO,IAAM,aAAiC;AAAA,EAC5C,MAAM;AAAA,EACN,UAAU,QAAS,CAAC,MAAM,SAAmC;AAAA,IAE3D,MAAM,WAAW,0BAA0B,cAAc,KAAK,KAAK,QAAQ,OAAO;AAAA,IAClF,IAAI,UAAU;AAAA,MACZ,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,qBAAqB,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,IACnE,IAAI,mBAAmB,SAAS,SAAS;AAAA,MACvC,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,sBAAsB,mBAAmB,KAC7C,MACA,MACA,SACA,KAAK,cACL,CACF;AAAA,IACA,IAAI,UAAU,qBAAqB;AAAA,MACjC,OAAO;AAAA,IACT;AAAA,IACA,MAAM,gBAAgB;AAAA,IAGtB,MAAM,iBAAiB,2BACrB,MACA,oBACA,eACA,SACA,WACF;AAAA,IAEA,IAAI,eAAe,SAAS,WAAW,eAAe,SAAS,uBAAuB;AAAA,MACpF,OAAO;AAAA,IACT;AAAA,IAEA,OAAO,eAAe,eAAe,QAAQ,OAAO;AAAA;AAExD;",
|
|
8
|
+
"debugId": "81C16C1A4A35CECF64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
// src/functions/math/ceiling/ceiling.ts
|
|
2
|
+
import {
|
|
3
|
+
FormulaError
|
|
4
|
+
} from "src/core/types";
|
|
5
|
+
function ceilingOperation(numberValue, significanceValue, context) {
|
|
6
|
+
if (numberValue.type === "infinity") {
|
|
7
|
+
return numberValue;
|
|
8
|
+
}
|
|
9
|
+
if (significanceValue.type === "infinity") {
|
|
10
|
+
return {
|
|
11
|
+
type: "error",
|
|
12
|
+
err: FormulaError.VALUE,
|
|
13
|
+
message: "Cannot use infinity as significance",
|
|
14
|
+
errAddress: context.dependencyNode
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
const num = numberValue.value;
|
|
18
|
+
const sig = significanceValue.value;
|
|
19
|
+
if (sig === 0) {
|
|
20
|
+
return {
|
|
21
|
+
type: "error",
|
|
22
|
+
err: FormulaError.DIV0,
|
|
23
|
+
message: "Significance cannot be zero",
|
|
24
|
+
errAddress: context.dependencyNode
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
if (num > 0 && sig < 0) {
|
|
28
|
+
return {
|
|
29
|
+
type: "error",
|
|
30
|
+
err: FormulaError.NUM,
|
|
31
|
+
message: "Positive number cannot be used with negative significance",
|
|
32
|
+
errAddress: context.dependencyNode
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
if (num < 0 && sig > 0) {
|
|
36
|
+
return {
|
|
37
|
+
type: "error",
|
|
38
|
+
err: FormulaError.NUM,
|
|
39
|
+
message: "Negative number cannot be used with positive significance",
|
|
40
|
+
errAddress: context.dependencyNode
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
let result;
|
|
44
|
+
if (sig > 0) {
|
|
45
|
+
result = Math.ceil(num / sig) * sig;
|
|
46
|
+
} else {
|
|
47
|
+
result = Math.ceil(num / sig) * sig;
|
|
48
|
+
}
|
|
49
|
+
return { type: "number", value: result };
|
|
50
|
+
}
|
|
51
|
+
function createCeilingSpilledResult({
|
|
52
|
+
numberResult,
|
|
53
|
+
significanceResult,
|
|
54
|
+
context
|
|
55
|
+
}) {
|
|
56
|
+
const hasSpilledNumber = numberResult.type === "spilled-values";
|
|
57
|
+
const hasSpilledSignificance = significanceResult.type === "spilled-values";
|
|
58
|
+
if (!hasSpilledNumber && !hasSpilledSignificance) {
|
|
59
|
+
throw new Error("createCeilingSpilledResult called without spilled values");
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
type: "spilled-values",
|
|
63
|
+
spillArea: (origin) => {
|
|
64
|
+
if (hasSpilledNumber && numberResult.type === "spilled-values") {
|
|
65
|
+
const spillArea = numberResult.spillArea(origin);
|
|
66
|
+
if (hasSpilledSignificance && significanceResult.type === "spilled-values") {
|
|
67
|
+
return this.unionRanges(this.projectRange(spillArea, origin), this.projectRange(significanceResult.spillArea(origin), origin));
|
|
68
|
+
}
|
|
69
|
+
return spillArea;
|
|
70
|
+
} else if (hasSpilledSignificance && significanceResult.type === "spilled-values") {
|
|
71
|
+
return significanceResult.spillArea(origin);
|
|
72
|
+
} else {
|
|
73
|
+
throw new Error("No spilled values found");
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
source: "CEILING with spilled values",
|
|
77
|
+
evaluate: (spilledCell, evalContext) => {
|
|
78
|
+
const spillNumberResult = hasSpilledNumber ? numberResult.evaluate(spilledCell, evalContext) : numberResult;
|
|
79
|
+
const spillSigResult = hasSpilledSignificance ? significanceResult.evaluate(spilledCell, evalContext) : significanceResult;
|
|
80
|
+
if (spillNumberResult === undefined || spillSigResult === undefined) {
|
|
81
|
+
return {
|
|
82
|
+
type: "error",
|
|
83
|
+
err: FormulaError.REF,
|
|
84
|
+
message: "The spilled results have not been evaluated",
|
|
85
|
+
errAddress: context.dependencyNode
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
if (spillNumberResult.type === "error") {
|
|
89
|
+
return spillNumberResult;
|
|
90
|
+
}
|
|
91
|
+
if (spillSigResult.type === "error") {
|
|
92
|
+
return spillSigResult;
|
|
93
|
+
}
|
|
94
|
+
if (spillNumberResult.type !== "value" || spillSigResult.type !== "value") {
|
|
95
|
+
return {
|
|
96
|
+
type: "error",
|
|
97
|
+
err: FormulaError.VALUE,
|
|
98
|
+
message: "Invalid spilled result for CEILING",
|
|
99
|
+
errAddress: context.dependencyNode
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
if (spillNumberResult.result.type !== "number" && spillNumberResult.result.type !== "infinity") {
|
|
103
|
+
return {
|
|
104
|
+
type: "error",
|
|
105
|
+
err: FormulaError.VALUE,
|
|
106
|
+
message: "Number argument must be a number",
|
|
107
|
+
errAddress: context.dependencyNode
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
if (spillSigResult.result.type !== "number" && spillSigResult.result.type !== "infinity") {
|
|
111
|
+
return {
|
|
112
|
+
type: "error",
|
|
113
|
+
err: FormulaError.VALUE,
|
|
114
|
+
message: "Significance argument must be a number",
|
|
115
|
+
errAddress: context.dependencyNode
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
const result = ceilingOperation(spillNumberResult.result, spillSigResult.result, context);
|
|
119
|
+
if (result.type === "error" || result.type === "awaiting-evaluation") {
|
|
120
|
+
return result;
|
|
121
|
+
}
|
|
122
|
+
return { type: "value", result };
|
|
123
|
+
},
|
|
124
|
+
evaluateAllCells: (intersectingRange) => {
|
|
125
|
+
throw new Error("WIP: evaluateAllCells for CEILING is not implemented");
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
var CEILING = {
|
|
130
|
+
name: "CEILING",
|
|
131
|
+
evaluate: function(node, context) {
|
|
132
|
+
if (node.args.length !== 2) {
|
|
133
|
+
return {
|
|
134
|
+
type: "error",
|
|
135
|
+
err: FormulaError.VALUE,
|
|
136
|
+
message: "CEILING function takes exactly 2 arguments",
|
|
137
|
+
errAddress: context.dependencyNode
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
const numberResult = this.evaluateNode(node.args[0], context);
|
|
141
|
+
if (numberResult.type === "error" || numberResult.type === "awaiting-evaluation") {
|
|
142
|
+
return numberResult;
|
|
143
|
+
}
|
|
144
|
+
const significanceResult = this.evaluateNode(node.args[1], context);
|
|
145
|
+
if (significanceResult.type === "error" || significanceResult.type === "awaiting-evaluation") {
|
|
146
|
+
return significanceResult;
|
|
147
|
+
}
|
|
148
|
+
const hasSpilledValues = numberResult.type === "spilled-values" || significanceResult.type === "spilled-values";
|
|
149
|
+
if (hasSpilledValues) {
|
|
150
|
+
return createCeilingSpilledResult.call(this, {
|
|
151
|
+
numberResult,
|
|
152
|
+
significanceResult,
|
|
153
|
+
context
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
if (numberResult.type !== "value" || significanceResult.type !== "value") {
|
|
157
|
+
return {
|
|
158
|
+
type: "error",
|
|
159
|
+
err: FormulaError.VALUE,
|
|
160
|
+
message: "Invalid argument type",
|
|
161
|
+
errAddress: context.dependencyNode
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
if (numberResult.result.type !== "number" && numberResult.result.type !== "infinity") {
|
|
165
|
+
return {
|
|
166
|
+
type: "error",
|
|
167
|
+
err: FormulaError.VALUE,
|
|
168
|
+
message: "Number argument must be a number",
|
|
169
|
+
errAddress: context.dependencyNode
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
if (significanceResult.result.type !== "number" && significanceResult.result.type !== "infinity") {
|
|
173
|
+
return {
|
|
174
|
+
type: "error",
|
|
175
|
+
err: FormulaError.VALUE,
|
|
176
|
+
message: "Significance argument must be a number",
|
|
177
|
+
errAddress: context.dependencyNode
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
const result = ceilingOperation(numberResult.result, significanceResult.result, context);
|
|
181
|
+
if (result.type === "error" || result.type === "awaiting-evaluation") {
|
|
182
|
+
return result;
|
|
183
|
+
}
|
|
184
|
+
return { type: "value", result };
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
export {
|
|
188
|
+
CEILING
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
//# debugId=3507AD64BBC0A37164756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/functions/math/ceiling/ceiling.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import {\n FormulaError,\n type CellValue,\n type CellNumber,\n type CellInfinity,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n type ValueEvaluationResult,\n type CellAddress,\n type SpreadsheetRange,\n type SpilledValuesEvaluationResult,\n type SingleEvaluationResult,\n type ErrorEvaluationResult,\n} from \"src/core/types\";\nimport type { FormulaEvaluator } from \"src/evaluator/formula-evaluator\";\nimport type { EvaluationContext } from \"src/evaluator/evaluation-context\";\n\n/**\n * CEILING function - Rounds a number up to the nearest multiple of significance\n *\n * Usage: CEILING(number, significance)\n *\n * number: The number to round up (required)\n * significance: The multiple to round up to (required)\n *\n * Examples:\n * CEILING(4.3) returns 5 (rounds up to nearest integer)\n * CEILING(4.3, 0.5) returns 4.5 (rounds up to nearest 0.5)\n * CEILING(-2.1, -1) returns -3 (rounds away from zero)\n *\n * Note:\n * - Both arguments are required and must be numbers (no type coercion)\n * - Positive number with negative significance returns #NUM! error\n * - Supports spilled values (dynamic arrays)\n * - Handles infinity values appropriately\n */\n\n/**\n * Helper function to perform CEILING operation\n */\nfunction ceilingOperation(\n numberValue: CellNumber | CellInfinity,\n significanceValue: CellNumber | CellInfinity,\n context: EvaluationContext\n): CellNumber | CellInfinity | ErrorEvaluationResult {\n // Handle infinity cases\n if (numberValue.type === \"infinity\") {\n return numberValue; // Infinity remains infinity\n }\n\n if (significanceValue.type === \"infinity\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Cannot use infinity as significance\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Both are numbers\n const num = numberValue.value;\n const sig = significanceValue.value;\n\n // Significance cannot be zero\n if (sig === 0) {\n return {\n type: \"error\",\n err: FormulaError.DIV0,\n message: \"Significance cannot be zero\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Excel CEILING behavior based on testing:\n // - Always rounds away from zero\n // - Positive number with negative significance gives #NUM! error\n\n if (num > 0 && sig < 0) {\n return {\n type: \"error\",\n err: FormulaError.NUM,\n message: \"Positive number cannot be used with negative significance\",\n errAddress: context.dependencyNode,\n };\n }\n\n if (num < 0 && sig > 0) {\n return {\n type: \"error\",\n err: FormulaError.NUM,\n message: \"Negative number cannot be used with positive significance\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Calculate result - always rounds away from zero\n let result: number;\n\n if (sig > 0) {\n // Positive significance with positive/zero number\n result = Math.ceil(num / sig) * sig;\n } else {\n // Negative significance with negative/zero number\n // Round away from zero: -2.1/-1 = 2.1, ceil(2.1) = 3, 3*-1 = -3\n result = Math.ceil(num / sig) * sig;\n }\n\n return { type: \"number\", value: result };\n}\n\n/**\n * Helper for creating spilled-values result for CEILING function\n */\nfunction createCeilingSpilledResult(\n this: FormulaEvaluator,\n {\n numberResult,\n significanceResult,\n context,\n }: {\n numberResult: FunctionEvaluationResult;\n significanceResult: FunctionEvaluationResult;\n context: EvaluationContext;\n }\n): SpilledValuesEvaluationResult | ErrorEvaluationResult {\n const hasSpilledNumber = numberResult.type === \"spilled-values\";\n const hasSpilledSignificance = significanceResult.type === \"spilled-values\";\n\n if (!hasSpilledNumber && !hasSpilledSignificance) {\n throw new Error(\"createCeilingSpilledResult called without spilled values\");\n }\n\n return {\n type: \"spilled-values\",\n spillArea: (origin: CellAddress): SpreadsheetRange => {\n // Calculate spill area (union of spilled ranges)\n if (hasSpilledNumber && numberResult.type === \"spilled-values\") {\n const spillArea = numberResult.spillArea(origin);\n if (\n hasSpilledSignificance &&\n significanceResult.type === \"spilled-values\"\n ) {\n return this.unionRanges(\n this.projectRange(spillArea, origin),\n this.projectRange(significanceResult.spillArea(origin), origin)\n );\n }\n return spillArea;\n } else if (\n hasSpilledSignificance &&\n significanceResult.type === \"spilled-values\"\n ) {\n return significanceResult.spillArea(origin);\n } else {\n throw new Error(\"No spilled values found\");\n }\n },\n source: \"CEILING with spilled values\",\n evaluate: (spilledCell: any, evalContext: any): SingleEvaluationResult => {\n // Evaluate arguments at this spilled position\n const spillNumberResult = hasSpilledNumber\n ? numberResult.evaluate(spilledCell, evalContext)\n : numberResult;\n const spillSigResult = hasSpilledSignificance\n ? significanceResult.evaluate(spilledCell, evalContext)\n : significanceResult;\n\n if (spillNumberResult === undefined || spillSigResult === undefined) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"The spilled results have not been evaluated\",\n errAddress: context.dependencyNode,\n };\n }\n\n if (spillNumberResult.type === \"error\") {\n return spillNumberResult;\n }\n if (spillSigResult.type === \"error\") {\n return spillSigResult;\n }\n\n if (\n spillNumberResult.type !== \"value\" ||\n spillSigResult.type !== \"value\"\n ) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Invalid spilled result for CEILING\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Type checking\n if (\n spillNumberResult.result.type !== \"number\" &&\n spillNumberResult.result.type !== \"infinity\"\n ) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Number argument must be a number\",\n errAddress: context.dependencyNode,\n };\n }\n\n if (\n spillSigResult.result.type !== \"number\" &&\n spillSigResult.result.type !== \"infinity\"\n ) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Significance argument must be a number\",\n errAddress: context.dependencyNode,\n };\n }\n\n const result = ceilingOperation(\n spillNumberResult.result,\n spillSigResult.result,\n context\n );\n if (result.type === \"error\" || result.type === \"awaiting-evaluation\") {\n return result;\n }\n return { type: \"value\", result };\n },\n evaluateAllCells: (intersectingRange: any) => {\n throw new Error(\"WIP: evaluateAllCells for CEILING is not implemented\");\n },\n };\n}\n\n/**\n * CEILING function implementation\n */\nexport const CEILING: FunctionDefinition = {\n name: \"CEILING\",\n evaluate: function (node, context): FunctionEvaluationResult {\n if (node.args.length !== 2) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"CEILING function takes exactly 2 arguments\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Evaluate number argument\n const numberResult = this.evaluateNode(node.args[0]!, context);\n if (numberResult.type === \"error\" || numberResult.type === \"awaiting-evaluation\") {\n return numberResult;\n }\n\n // Evaluate significance argument (required)\n const significanceResult = this.evaluateNode(node.args[1]!, context);\n if (significanceResult.type === \"error\" || significanceResult.type === \"awaiting-evaluation\") {\n return significanceResult;\n }\n\n // Handle spilled values\n const hasSpilledValues =\n numberResult.type === \"spilled-values\" ||\n significanceResult.type === \"spilled-values\";\n\n if (hasSpilledValues) {\n return createCeilingSpilledResult.call(this, {\n numberResult,\n significanceResult,\n context,\n });\n }\n\n // Both arguments are single values\n if (numberResult.type !== \"value\" || significanceResult.type !== \"value\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Invalid argument type\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Type checking - only numbers and infinity allowed\n if (\n numberResult.result.type !== \"number\" &&\n numberResult.result.type !== \"infinity\"\n ) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Number argument must be a number\",\n errAddress: context.dependencyNode,\n };\n }\n\n if (\n significanceResult.result.type !== \"number\" &&\n significanceResult.result.type !== \"infinity\"\n ) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Significance argument must be a number\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Perform CEILING operation\n const result = ceilingOperation(\n numberResult.result,\n significanceResult.result,\n context\n );\n if (result.type === \"error\" || result.type === \"awaiting-evaluation\") {\n return result;\n }\n return { type: \"value\", result };\n },\n};\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "3507AD64BBC0A37164756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// src/functions/math/max/max-utils.ts
|
|
2
|
+
import {
|
|
3
|
+
FormulaError
|
|
4
|
+
} from "src/core/types";
|
|
5
|
+
function performMaximum(results, context) {
|
|
6
|
+
let maxValue = -Infinity;
|
|
7
|
+
let hasValues = false;
|
|
8
|
+
for (const result of results) {
|
|
9
|
+
if (result.type === "error") {
|
|
10
|
+
return result;
|
|
11
|
+
}
|
|
12
|
+
if (result.type === "value") {
|
|
13
|
+
if (result.result.type === "number") {
|
|
14
|
+
maxValue = Math.max(maxValue, result.result.value);
|
|
15
|
+
hasValues = true;
|
|
16
|
+
} else if (result.result.type === "infinity") {
|
|
17
|
+
if (result.result.sign === "positive") {
|
|
18
|
+
return {
|
|
19
|
+
type: "value",
|
|
20
|
+
result: result.result
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (!hasValues) {
|
|
27
|
+
return {
|
|
28
|
+
type: "error",
|
|
29
|
+
err: FormulaError.VALUE,
|
|
30
|
+
message: "No numeric values found",
|
|
31
|
+
errAddress: context.dependencyNode
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
type: "value",
|
|
36
|
+
result: { type: "number", value: maxValue }
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export {
|
|
40
|
+
performMaximum
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
//# debugId=B42D64F3DF6AD2FE64756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/functions/math/max/max-utils.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import {\n FormulaError,\n type FunctionEvaluationResult,\n type SingleEvaluationResult,\n type CellInfinity,\n} from \"src/core/types\";\nimport type { EvaluationContext } from \"src/evaluator/evaluation-context\";\n\n/**\n * Result type for processInfinity in max functions\n */\nexport type ProcessInfinityResult<T> =\n | { type: \"infinity\"; infinity: CellInfinity }\n | { type: \"state\"; state: T };\n\n/**\n * Perform maximum calculation over an iterator of SingleEvaluationResults\n * Handles the common logic shared by MAX, MAXIF, MAXIFS functions\n *\n * @param results - Iterator of SingleEvaluationResults to find maximum from\n * @returns FunctionEvaluationResult with the maximum, infinity, or error\n */\nexport function performMaximum(\n results: Iterable<SingleEvaluationResult>,\n context: EvaluationContext\n): FunctionEvaluationResult {\n let maxValue = -Infinity;\n let hasValues = false;\n\n for (const result of results) {\n if (result.type === \"error\") {\n // Propagate errors immediately\n return result;\n }\n\n if (result.type === \"value\") {\n if (result.result.type === \"number\") {\n maxValue = Math.max(maxValue, result.result.value);\n hasValues = true;\n } else if (result.result.type === \"infinity\") {\n if (result.result.sign === \"positive\") {\n // Positive infinity is always the maximum - return immediately\n return {\n type: \"value\",\n result: result.result,\n };\n }\n // Negative infinity doesn't change the maximum\n }\n // Non-numeric values (strings, booleans) are ignored in maximum calculation\n }\n }\n\n if (!hasValues) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"No numeric values found\",\n errAddress: context.dependencyNode,\n };\n }\n\n return {\n type: \"value\",\n result: { type: \"number\", value: maxValue },\n };\n}\n\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";AAAA;AAAA;AAAA;AAsBO,SAAS,cAAc,CAC5B,SACA,SAC0B;AAAA,EAC1B,IAAI,WAAW;AAAA,EACf,IAAI,YAAY;AAAA,EAEhB,WAAW,UAAU,SAAS;AAAA,IAC5B,IAAI,OAAO,SAAS,SAAS;AAAA,MAE3B,OAAO;AAAA,IACT;AAAA,IAEA,IAAI,OAAO,SAAS,SAAS;AAAA,MAC3B,IAAI,OAAO,OAAO,SAAS,UAAU;AAAA,QACnC,WAAW,KAAK,IAAI,UAAU,OAAO,OAAO,KAAK;AAAA,QACjD,YAAY;AAAA,MACd,EAAO,SAAI,OAAO,OAAO,SAAS,YAAY;AAAA,QAC5C,IAAI,OAAO,OAAO,SAAS,YAAY;AAAA,UAErC,OAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ,OAAO;AAAA,UACjB;AAAA,QACF;AAAA,MAEF;AAAA,IAEF;AAAA,EACF;AAAA,EAEA,IAAI,CAAC,WAAW;AAAA,IACd,OAAO;AAAA,MACL,MAAM;AAAA,MACN,KAAK,aAAa;AAAA,MAClB,SAAS;AAAA,MACT,YAAY,QAAQ;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,EAAE,MAAM,UAAU,OAAO,SAAS;AAAA,EAC5C;AAAA;",
|
|
8
|
+
"debugId": "B42D64F3DF6AD2FE64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// src/functions/math/max/max.ts
|
|
2
|
+
import { performMaximum } from "./max-utils.mjs";
|
|
3
|
+
import { createArgumentIterator } from "src/functions/function-utils";
|
|
4
|
+
var MAX = {
|
|
5
|
+
name: "MAX",
|
|
6
|
+
evaluate: function(node, context) {
|
|
7
|
+
const argumentValues = createArgumentIterator(this, node, context, "col-major");
|
|
8
|
+
if (argumentValues.type !== "values") {
|
|
9
|
+
return argumentValues;
|
|
10
|
+
}
|
|
11
|
+
return performMaximum(argumentValues.values, context);
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
export {
|
|
15
|
+
MAX
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
//# debugId=9D5A2733BE9346AF64756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/functions/math/max/max.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import {\n type FunctionDefinition,\n type FunctionEvaluationResult,\n} from \"src/core/types\";\nimport { performMaximum } from \"./max-utils.mjs\";\nimport { createArgumentIterator } from \"src/functions/function-utils\";\n\n/**\n * MAX function - Returns the largest number in the arguments\n *\n * Usage: MAX(value1, [value2], ...)\n *\n * Examples:\n * MAX(1, 2, 3) - returns 3\n * MAX(A1:A10) - finds maximum in the range A1:A10\n * MAX(A1:A5, B1:B5) - finds maximum across both ranges\n *\n * Note:\n * - Only numeric values are considered\n * - Text, logical values, and empty cells are ignored in ranges\n * - Direct text/logical arguments cause errors\n * - Returns error if no numeric values are found\n */\nexport const MAX: FunctionDefinition = {\n name: \"MAX\",\n evaluate: function (node, context): FunctionEvaluationResult {\n // Create iterator over all argument values\n const argumentValues = createArgumentIterator(this, node, context, \"col-major\");\n if (argumentValues.type !== \"values\") {\n return argumentValues;\n }\n // Use shared maximum utility (now with unified error propagation)\n return performMaximum(argumentValues.values, context);\n },\n};\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";AAIA;AACA;AAkBO,IAAM,MAA0B;AAAA,EACrC,MAAM;AAAA,EACN,UAAU,QAAS,CAAC,MAAM,SAAmC;AAAA,IAE3D,MAAM,iBAAiB,uBAAuB,MAAM,MAAM,SAAS,WAAW;AAAA,IAC9E,IAAI,eAAe,SAAS,UAAU;AAAA,MACpC,OAAO;AAAA,IACT;AAAA,IAEA,OAAO,eAAe,eAAe,QAAQ,OAAO;AAAA;AAExD;",
|
|
8
|
+
"debugId": "9D5A2733BE9346AF64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// src/functions/math/max/maxif.ts
|
|
2
|
+
import {
|
|
3
|
+
FormulaError
|
|
4
|
+
} from "src/core/types";
|
|
5
|
+
import {
|
|
6
|
+
processMultiCriteriaValues,
|
|
7
|
+
validateSingleCriteriaArgs
|
|
8
|
+
} from "../../criteria-utils.mjs";
|
|
9
|
+
import { parseCriteria } from "../../criteria-parser.mjs";
|
|
10
|
+
import { performMaximum } from "./max-utils.mjs";
|
|
11
|
+
var MAXIF = {
|
|
12
|
+
name: "MAXIF",
|
|
13
|
+
evaluate: function(node, context) {
|
|
14
|
+
const argError = validateSingleCriteriaArgs("MAXIF", node.args.length, context);
|
|
15
|
+
if (argError) {
|
|
16
|
+
return argError;
|
|
17
|
+
}
|
|
18
|
+
const criteriaRangeResult = this.evaluateNode(node.args[0], context);
|
|
19
|
+
if (criteriaRangeResult.type === "error") {
|
|
20
|
+
return criteriaRangeResult;
|
|
21
|
+
}
|
|
22
|
+
const criteriaResult = this.evaluateNode(node.args[1], context);
|
|
23
|
+
if (criteriaResult.type === "error") {
|
|
24
|
+
return criteriaResult;
|
|
25
|
+
}
|
|
26
|
+
if (criteriaResult.type !== "value") {
|
|
27
|
+
return {
|
|
28
|
+
type: "error",
|
|
29
|
+
err: FormulaError.VALUE,
|
|
30
|
+
message: "MAXIF criteria must be a single value",
|
|
31
|
+
errAddress: context.dependencyNode
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const parsedCriteria = parseCriteria(criteriaResult.result);
|
|
35
|
+
if (parsedCriteria.type === "error") {
|
|
36
|
+
return {
|
|
37
|
+
type: "error",
|
|
38
|
+
err: FormulaError.VALUE,
|
|
39
|
+
message: parsedCriteria.message,
|
|
40
|
+
errAddress: context.dependencyNode
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const maxRangeResult = node.args.length === 3 ? this.evaluateNode(node.args[2], context) : criteriaRangeResult;
|
|
44
|
+
if (maxRangeResult.type === "error") {
|
|
45
|
+
return maxRangeResult;
|
|
46
|
+
}
|
|
47
|
+
const matchingValues = processMultiCriteriaValues(this, maxRangeResult, [{ rangeResult: criteriaRangeResult, parsedCriteria }], context, "col-major");
|
|
48
|
+
if (matchingValues.type === "error" || matchingValues.type === "awaiting-evaluation") {
|
|
49
|
+
return matchingValues;
|
|
50
|
+
}
|
|
51
|
+
return performMaximum(matchingValues.values, context);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
export {
|
|
55
|
+
MAXIF
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
//# debugId=5350E4759DCAFED564756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/functions/math/max/maxif.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import {\n FormulaError,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n} from \"src/core/types\";\nimport type { EvaluationContext } from \"src/evaluator/evaluation-context\";\nimport {\n processMultiCriteriaValues,\n validateSingleCriteriaArgs,\n} from \"../../criteria-utils.mjs\";\nimport { parseCriteria, matchesParsedCriteria } from \"../../criteria-parser.mjs\";\nimport { performMaximum } from \"./max-utils.mjs\";\n\n/**\n * MAXIF function - Returns the maximum value among cells specified by a criteria\n *\n * Usage: MAXIF(range, criteria, [max_range])\n *\n * range: The range of cells to evaluate against the criteria\n * criteria: The criteria to match against. Can be:\n * - Exact value: \"Apple\", 42\n * - Comparison: \">10\", \"<=5\", \"<>0\"\n * - Wildcards: \"App*\", \"?ruit\"\n * max_range: Optional. The range to find maximum from. If omitted, uses the range parameter\n *\n * Examples:\n * MAXIF(A1:A10, \"Apple\") - max of cells in A1:A10 that contain \"Apple\"\n * MAXIF(B1:B10, \">10\") - max of cells in B1:B10 with values greater than 10\n * MAXIF(A1:A10, \"Apple\", B1:B10) - max of B1:B10 where A1:A10 contains \"Apple\"\n *\n * Note:\n * - Only numeric values are considered for the maximum\n * - Returns error if no values match the criteria\n */\nexport const MAXIF: FunctionDefinition = {\n name: \"MAXIF\",\n evaluate: function (node, context): FunctionEvaluationResult {\n // Validate arguments\n const argError = validateSingleCriteriaArgs(\"MAXIF\", node.args.length, context);\n if (argError) {\n return argError;\n }\n\n // Evaluate criteria range (first argument)\n const criteriaRangeResult = this.evaluateNode(node.args[0]!, context);\n if (criteriaRangeResult.type === \"error\") {\n return criteriaRangeResult;\n }\n\n // Evaluate criteria (second argument)\n const criteriaResult = this.evaluateNode(node.args[1]!, context);\n if (criteriaResult.type === \"error\") {\n return criteriaResult;\n }\n\n if (criteriaResult.type !== \"value\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"MAXIF criteria must be a single value\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Parse criteria\n const parsedCriteria = parseCriteria(criteriaResult.result);\n if (parsedCriteria.type === \"error\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: parsedCriteria.message,\n errAddress: context.dependencyNode,\n };\n }\n\n // Determine max range (third argument if present, otherwise same as criteria range)\n const maxRangeResult =\n node.args.length === 3\n ? this.evaluateNode(node.args[2]!, context)\n : criteriaRangeResult;\n\n if (maxRangeResult.type === \"error\") {\n return maxRangeResult;\n }\n\n // Use shared maximum utility\n const matchingValues = processMultiCriteriaValues(\n this,\n maxRangeResult,\n [{ rangeResult: criteriaRangeResult, parsedCriteria }],\n context,\n \"col-major\"\n );\n\n if (matchingValues.type === \"error\" || matchingValues.type === \"awaiting-evaluation\") {\n return matchingValues;\n }\n\n return performMaximum(matchingValues.values, context);\n },\n};\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";AAAA;AAAA;AAAA;AAMA;AAAA;AAAA;AAAA;AAIA;AACA;AAuBO,IAAM,QAA4B;AAAA,EACvC,MAAM;AAAA,EACN,UAAU,QAAS,CAAC,MAAM,SAAmC;AAAA,IAE3D,MAAM,WAAW,2BAA2B,SAAS,KAAK,KAAK,QAAQ,OAAO;AAAA,IAC9E,IAAI,UAAU;AAAA,MACZ,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,sBAAsB,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,IACpE,IAAI,oBAAoB,SAAS,SAAS;AAAA,MACxC,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,iBAAiB,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,IAC/D,IAAI,eAAe,SAAS,SAAS;AAAA,MACnC,OAAO;AAAA,IACT;AAAA,IAEA,IAAI,eAAe,SAAS,SAAS;AAAA,MACnC,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,aAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAGA,MAAM,iBAAiB,cAAc,eAAe,MAAM;AAAA,IAC1D,IAAI,eAAe,SAAS,SAAS;AAAA,MACnC,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,aAAa;AAAA,QAClB,SAAS,eAAe;AAAA,QACxB,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAGA,MAAM,iBACJ,KAAK,KAAK,WAAW,IACjB,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO,IACxC;AAAA,IAEN,IAAI,eAAe,SAAS,SAAS;AAAA,MACnC,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,iBAAiB,2BACrB,MACA,gBACA,CAAC,EAAE,aAAa,qBAAqB,eAAe,CAAC,GACrD,SACA,WACF;AAAA,IAEA,IAAI,eAAe,SAAS,WAAW,eAAe,SAAS,uBAAuB;AAAA,MACpF,OAAO;AAAA,IACT;AAAA,IAEA,OAAO,eAAe,eAAe,QAAQ,OAAO;AAAA;AAExD;",
|
|
8
|
+
"debugId": "5350E4759DCAFED564756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// src/functions/math/max/maxifs.ts
|
|
2
|
+
import {
|
|
3
|
+
parseCriteriaPairs,
|
|
4
|
+
processMultiCriteriaValues,
|
|
5
|
+
validateMultiCriteriaArgs
|
|
6
|
+
} from "../../criteria-utils.mjs";
|
|
7
|
+
import { performMaximum } from "./max-utils.mjs";
|
|
8
|
+
var MAXIFS = {
|
|
9
|
+
name: "MAXIFS",
|
|
10
|
+
evaluate: function(node, context) {
|
|
11
|
+
const argError = validateMultiCriteriaArgs("MAXIFS", node.args.length, context);
|
|
12
|
+
if (argError) {
|
|
13
|
+
return argError;
|
|
14
|
+
}
|
|
15
|
+
const maxRangeResult = this.evaluateNode(node.args[0], context);
|
|
16
|
+
if (maxRangeResult.type === "error") {
|
|
17
|
+
return maxRangeResult;
|
|
18
|
+
}
|
|
19
|
+
const criteriaPairsResult = parseCriteriaPairs.call(this, node, context, this.evaluateNode, 1);
|
|
20
|
+
if ("type" in criteriaPairsResult) {
|
|
21
|
+
return criteriaPairsResult;
|
|
22
|
+
}
|
|
23
|
+
const criteriaPairs = criteriaPairsResult;
|
|
24
|
+
const matchingValues = processMultiCriteriaValues(this, maxRangeResult, criteriaPairs, context, "col-major");
|
|
25
|
+
if (matchingValues.type === "error" || matchingValues.type === "awaiting-evaluation") {
|
|
26
|
+
return matchingValues;
|
|
27
|
+
}
|
|
28
|
+
return performMaximum(matchingValues.values, context);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
export {
|
|
32
|
+
MAXIFS
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
//# debugId=77A345BBA074DE7F64756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/functions/math/max/maxifs.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import {\n FormulaError,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n} from \"src/core/types\";\nimport type { EvaluationContext } from \"src/evaluator/evaluation-context\";\nimport {\n parseCriteriaPairs,\n processMultiCriteriaValues,\n validateMultiCriteriaArgs,\n} from \"../../criteria-utils.mjs\";\nimport { performMaximum } from \"./max-utils.mjs\";\n\n/**\n * MAXIFS function - Returns the maximum value among cells specified by multiple criteria\n *\n * Usage: MAXIFS(max_range, criteria_range1, criteria1, [criteria_range2, criteria2], ...)\n *\n * max_range: The range of cells from which you want the maximum\n * criteria_range1: The first range in which to evaluate criteria\n * criteria1: The criteria to apply to criteria_range1\n * criteria_range2, criteria2: Optional additional criteria pairs\n *\n * Examples:\n * MAXIFS(B1:B10, A1:A10, \"Apple\") - max of B1:B10 where A1:A10 = \"Apple\"\n * MAXIFS(C1:C10, A1:A10, \"Apple\", B1:B10, \">10\") - max of C1:C10 where A1:A10 = \"Apple\" AND B1:B10 > 10\n *\n * Note:\n * - All criteria must be satisfied for a value to be included\n * - Only numeric values are considered for the maximum\n * - Returns error if no values match all criteria\n */\nexport const MAXIFS: FunctionDefinition = {\n name: \"MAXIFS\",\n evaluate: function (node, context): FunctionEvaluationResult {\n // Validate arguments using utility\n const argError = validateMultiCriteriaArgs(\"MAXIFS\", node.args.length, context);\n if (argError) {\n return argError;\n }\n\n // Evaluate max range\n const maxRangeResult = this.evaluateNode(node.args[0]!, context);\n if (maxRangeResult.type === \"error\") {\n return maxRangeResult;\n }\n\n // Parse criteria pairs using utility\n const criteriaPairsResult = parseCriteriaPairs.call(\n this,\n node,\n context,\n this.evaluateNode,\n 1\n );\n if (\"type\" in criteriaPairsResult) {\n return criteriaPairsResult;\n }\n const criteriaPairs = criteriaPairsResult;\n\n // Use shared maximum utility for standard cases\n const matchingValues = processMultiCriteriaValues(\n this,\n maxRangeResult,\n criteriaPairs,\n context,\n \"col-major\"\n );\n\n if (matchingValues.type === \"error\" || matchingValues.type === \"awaiting-evaluation\") {\n return matchingValues;\n }\n\n return performMaximum(matchingValues.values, context);\n },\n};\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";AAMA;AAAA;AAAA;AAAA;AAAA;AAKA;AAqBO,IAAM,SAA6B;AAAA,EACxC,MAAM;AAAA,EACN,UAAU,QAAS,CAAC,MAAM,SAAmC;AAAA,IAE3D,MAAM,WAAW,0BAA0B,UAAU,KAAK,KAAK,QAAQ,OAAO;AAAA,IAC9E,IAAI,UAAU;AAAA,MACZ,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,iBAAiB,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,IAC/D,IAAI,eAAe,SAAS,SAAS;AAAA,MACnC,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,sBAAsB,mBAAmB,KAC7C,MACA,MACA,SACA,KAAK,cACL,CACF;AAAA,IACA,IAAI,UAAU,qBAAqB;AAAA,MACjC,OAAO;AAAA,IACT;AAAA,IACA,MAAM,gBAAgB;AAAA,IAGtB,MAAM,iBAAiB,2BACrB,MACA,gBACA,eACA,SACA,WACF;AAAA,IAEA,IAAI,eAAe,SAAS,WAAW,eAAe,SAAS,uBAAuB;AAAA,MACpF,OAAO;AAAA,IACT;AAAA,IAEA,OAAO,eAAe,eAAe,QAAQ,OAAO;AAAA;AAExD;",
|
|
8
|
+
"debugId": "77A345BBA074DE7F64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// src/functions/math/min/min-utils.ts
|
|
2
|
+
import {
|
|
3
|
+
FormulaError
|
|
4
|
+
} from "src/core/types";
|
|
5
|
+
function performMinimum(results, context) {
|
|
6
|
+
let minValue = Infinity;
|
|
7
|
+
let hasValues = false;
|
|
8
|
+
for (const result of results) {
|
|
9
|
+
if (result.type === "error") {
|
|
10
|
+
return result;
|
|
11
|
+
}
|
|
12
|
+
if (result.type === "value") {
|
|
13
|
+
if (result.result.type === "number") {
|
|
14
|
+
minValue = Math.min(minValue, result.result.value);
|
|
15
|
+
hasValues = true;
|
|
16
|
+
} else if (result.result.type === "infinity") {
|
|
17
|
+
if (result.result.sign === "negative") {
|
|
18
|
+
return {
|
|
19
|
+
type: "value",
|
|
20
|
+
result: result.result
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (!hasValues) {
|
|
27
|
+
return {
|
|
28
|
+
type: "error",
|
|
29
|
+
err: FormulaError.VALUE,
|
|
30
|
+
message: "No numeric values found",
|
|
31
|
+
errAddress: context.dependencyNode
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
type: "value",
|
|
36
|
+
result: { type: "number", value: minValue }
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export {
|
|
40
|
+
performMinimum
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
//# debugId=B3A2044B021358D264756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/functions/math/min/min-utils.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import {\n FormulaError,\n type FunctionEvaluationResult,\n type SingleEvaluationResult,\n type CellInfinity,\n} from \"src/core/types\";\nimport type { EvaluationContext } from \"src/evaluator/evaluation-context\";\nimport type { FormulaEvaluator } from \"src/evaluator/formula-evaluator\";\nimport type { FunctionNode } from \"src/parser/ast\";\n\n/**\n * Result type for processInfinity in min functions\n */\nexport type ProcessInfinityResult<T> =\n | { type: \"infinity\"; infinity: CellInfinity }\n | { type: \"state\"; state: T };\n\n/**\n * Perform minimum calculation over an iterator of SingleEvaluationResults\n * Handles the common logic shared by MIN, MINIF, MINIFS functions\n *\n * @param results - Iterator of SingleEvaluationResults to find minimum from\n * @returns FunctionEvaluationResult with the minimum, infinity, or error\n */\nexport function performMinimum(\n results: Iterable<SingleEvaluationResult>,\n context: EvaluationContext\n): FunctionEvaluationResult {\n let minValue = Infinity;\n let hasValues = false;\n\n for (const result of results) {\n if (result.type === \"error\") {\n // Propagate errors immediately\n return result;\n }\n\n if (result.type === \"value\") {\n if (result.result.type === \"number\") {\n minValue = Math.min(minValue, result.result.value);\n hasValues = true;\n } else if (result.result.type === \"infinity\") {\n if (result.result.sign === \"negative\") {\n // Negative infinity is always the minimum - return immediately\n return {\n type: \"value\",\n result: result.result,\n };\n }\n // Positive infinity doesn't change the minimum\n }\n // Non-numeric values (strings, booleans) are ignored in minimum calculation\n }\n }\n\n if (!hasValues) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"No numeric values found\",\n errAddress: context.dependencyNode,\n };\n }\n\n return {\n type: \"value\",\n result: { type: \"number\", value: minValue },\n };\n}\n\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";AAAA;AAAA;AAAA;AAwBO,SAAS,cAAc,CAC5B,SACA,SAC0B;AAAA,EAC1B,IAAI,WAAW;AAAA,EACf,IAAI,YAAY;AAAA,EAEhB,WAAW,UAAU,SAAS;AAAA,IAC5B,IAAI,OAAO,SAAS,SAAS;AAAA,MAE3B,OAAO;AAAA,IACT;AAAA,IAEA,IAAI,OAAO,SAAS,SAAS;AAAA,MAC3B,IAAI,OAAO,OAAO,SAAS,UAAU;AAAA,QACnC,WAAW,KAAK,IAAI,UAAU,OAAO,OAAO,KAAK;AAAA,QACjD,YAAY;AAAA,MACd,EAAO,SAAI,OAAO,OAAO,SAAS,YAAY;AAAA,QAC5C,IAAI,OAAO,OAAO,SAAS,YAAY;AAAA,UAErC,OAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ,OAAO;AAAA,UACjB;AAAA,QACF;AAAA,MAEF;AAAA,IAEF;AAAA,EACF;AAAA,EAEA,IAAI,CAAC,WAAW;AAAA,IACd,OAAO;AAAA,MACL,MAAM;AAAA,MACN,KAAK,aAAa;AAAA,MAClB,SAAS;AAAA,MACT,YAAY,QAAQ;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,EAAE,MAAM,UAAU,OAAO,SAAS;AAAA,EAC5C;AAAA;",
|
|
8
|
+
"debugId": "B3A2044B021358D264756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// src/functions/math/min/min.ts
|
|
2
|
+
import { performMinimum } from "./min-utils.mjs";
|
|
3
|
+
import { createArgumentIterator } from "src/functions/function-utils";
|
|
4
|
+
var MIN = {
|
|
5
|
+
name: "MIN",
|
|
6
|
+
evaluate: function(node, context) {
|
|
7
|
+
const argumentIterator = createArgumentIterator(this, node, context, "col-major");
|
|
8
|
+
if (argumentIterator.type !== "values") {
|
|
9
|
+
return argumentIterator;
|
|
10
|
+
}
|
|
11
|
+
return performMinimum(argumentIterator.values, context);
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
export {
|
|
15
|
+
MIN
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
//# debugId=A87E46630521EB2264756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/functions/math/min/min.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { type FunctionDefinition } from \"src/core/types\";\nimport { performMinimum } from \"./min-utils.mjs\";\nimport { createArgumentIterator } from \"src/functions/function-utils\";\n\n/**\n * MIN function - Returns the smallest number in the arguments\n */\nexport const MIN: FunctionDefinition = {\n name: \"MIN\",\n evaluate: function (node, context) {\n // Create iterator from all arguments\n const argumentIterator = createArgumentIterator(\n this,\n node,\n context,\n \"col-major\"\n );\n\n if (argumentIterator.type !== \"values\") {\n return argumentIterator;\n }\n\n // Perform minimum calculation (now with unified error propagation)\n return performMinimum(argumentIterator.values, context);\n },\n};\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";AACA;AACA;AAKO,IAAM,MAA0B;AAAA,EACrC,MAAM;AAAA,EACN,UAAU,QAAS,CAAC,MAAM,SAAS;AAAA,IAEjC,MAAM,mBAAmB,uBACvB,MACA,MACA,SACA,WACF;AAAA,IAEA,IAAI,iBAAiB,SAAS,UAAU;AAAA,MACtC,OAAO;AAAA,IACT;AAAA,IAGA,OAAO,eAAe,iBAAiB,QAAQ,OAAO;AAAA;AAE1D;",
|
|
8
|
+
"debugId": "A87E46630521EB2264756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// src/functions/math/min/minif.ts
|
|
2
|
+
import {
|
|
3
|
+
FormulaError
|
|
4
|
+
} from "src/core/types";
|
|
5
|
+
import {
|
|
6
|
+
processMultiCriteriaValues,
|
|
7
|
+
validateSingleCriteriaArgs
|
|
8
|
+
} from "../../criteria-utils.mjs";
|
|
9
|
+
import { parseCriteria } from "../../criteria-parser.mjs";
|
|
10
|
+
import { performMinimum } from "./min-utils.mjs";
|
|
11
|
+
var MINIF = {
|
|
12
|
+
name: "MINIF",
|
|
13
|
+
evaluate: function(node, context) {
|
|
14
|
+
const argError = validateSingleCriteriaArgs("MINIF", node.args.length, context);
|
|
15
|
+
if (argError) {
|
|
16
|
+
return argError;
|
|
17
|
+
}
|
|
18
|
+
const criteriaRangeResult = this.evaluateNode(node.args[0], context);
|
|
19
|
+
if (criteriaRangeResult.type === "error") {
|
|
20
|
+
return criteriaRangeResult;
|
|
21
|
+
}
|
|
22
|
+
const criteriaResult = this.evaluateNode(node.args[1], context);
|
|
23
|
+
if (criteriaResult.type === "error") {
|
|
24
|
+
return criteriaResult;
|
|
25
|
+
}
|
|
26
|
+
if (criteriaResult.type !== "value") {
|
|
27
|
+
return {
|
|
28
|
+
type: "error",
|
|
29
|
+
err: FormulaError.VALUE,
|
|
30
|
+
message: "MINIF criteria must be a single value",
|
|
31
|
+
errAddress: context.dependencyNode
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const parsedCriteria = parseCriteria(criteriaResult.result);
|
|
35
|
+
if (parsedCriteria.type === "error") {
|
|
36
|
+
return {
|
|
37
|
+
type: "error",
|
|
38
|
+
err: FormulaError.VALUE,
|
|
39
|
+
message: parsedCriteria.message,
|
|
40
|
+
errAddress: context.dependencyNode
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const minRangeResult = node.args.length === 3 ? this.evaluateNode(node.args[2], context) : criteriaRangeResult;
|
|
44
|
+
if (minRangeResult.type === "error") {
|
|
45
|
+
return minRangeResult;
|
|
46
|
+
}
|
|
47
|
+
const matchingValues = processMultiCriteriaValues(this, minRangeResult, [{ rangeResult: criteriaRangeResult, parsedCriteria }], context, "col-major");
|
|
48
|
+
if (matchingValues.type === "error" || matchingValues.type === "awaiting-evaluation") {
|
|
49
|
+
return matchingValues;
|
|
50
|
+
}
|
|
51
|
+
return performMinimum(matchingValues.values, context);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
export {
|
|
55
|
+
MINIF
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
//# debugId=4ABA08F6CF9EBBD864756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/functions/math/min/minif.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import {\n FormulaError,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n} from \"src/core/types\";\nimport type { EvaluationContext } from \"src/evaluator/evaluation-context\";\nimport {\n processMultiCriteriaValues,\n validateSingleCriteriaArgs,\n} from \"../../criteria-utils.mjs\";\nimport { parseCriteria, matchesParsedCriteria } from \"../../criteria-parser.mjs\";\nimport { performMinimum } from \"./min-utils.mjs\";\n\n/**\n * MINIF function - Returns the minimum value among cells specified by a criteria\n *\n * Usage: MINIF(range, criteria, [min_range])\n *\n * range: The range of cells to evaluate against the criteria\n * criteria: The criteria to match against. Can be:\n * - Exact value: \"Apple\", 42\n * - Comparison: \">10\", \"<=5\", \"<>0\"\n * - Wildcards: \"App*\", \"?ruit\"\n * min_range: Optional. The range to find minimum from. If omitted, uses the range parameter\n *\n * Examples:\n * MINIF(A1:A10, \"Apple\") - min of cells in A1:A10 that contain \"Apple\"\n * MINIF(B1:B10, \">10\") - min of cells in B1:B10 with values greater than 10\n * MINIF(A1:A10, \"Apple\", B1:B10) - min of B1:B10 where A1:A10 contains \"Apple\"\n *\n * Note:\n * - Only numeric values are considered for the minimum\n * - Returns error if no values match the criteria\n */\nexport const MINIF: FunctionDefinition = {\n name: \"MINIF\",\n evaluate: function (node, context): FunctionEvaluationResult {\n // Validate arguments\n const argError = validateSingleCriteriaArgs(\"MINIF\", node.args.length, context);\n if (argError) {\n return argError;\n }\n\n // Evaluate criteria range (first argument)\n const criteriaRangeResult = this.evaluateNode(node.args[0]!, context);\n if (criteriaRangeResult.type === \"error\") {\n return criteriaRangeResult;\n }\n\n // Evaluate criteria (second argument)\n const criteriaResult = this.evaluateNode(node.args[1]!, context);\n if (criteriaResult.type === \"error\") {\n return criteriaResult;\n }\n\n if (criteriaResult.type !== \"value\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"MINIF criteria must be a single value\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Parse criteria\n const parsedCriteria = parseCriteria(criteriaResult.result);\n if (parsedCriteria.type === \"error\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: parsedCriteria.message,\n errAddress: context.dependencyNode,\n };\n }\n\n // Determine min range (third argument if present, otherwise same as criteria range)\n const minRangeResult =\n node.args.length === 3\n ? this.evaluateNode(node.args[2]!, context)\n : criteriaRangeResult;\n\n if (minRangeResult.type === \"error\") {\n return minRangeResult;\n }\n\n // Use shared minimum utility for standard cases\n const matchingValues = processMultiCriteriaValues(\n this,\n minRangeResult,\n [{ rangeResult: criteriaRangeResult, parsedCriteria }],\n context,\n \"col-major\"\n );\n\n if (matchingValues.type === \"error\" || matchingValues.type === \"awaiting-evaluation\") {\n return matchingValues;\n }\n\n return performMinimum(matchingValues.values, context);\n },\n};\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";AAAA;AAAA;AAAA;AAMA;AAAA;AAAA;AAAA;AAIA;AACA;AAuBO,IAAM,QAA4B;AAAA,EACvC,MAAM;AAAA,EACN,UAAU,QAAS,CAAC,MAAM,SAAmC;AAAA,IAE3D,MAAM,WAAW,2BAA2B,SAAS,KAAK,KAAK,QAAQ,OAAO;AAAA,IAC9E,IAAI,UAAU;AAAA,MACZ,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,sBAAsB,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,IACpE,IAAI,oBAAoB,SAAS,SAAS;AAAA,MACxC,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,iBAAiB,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,IAC/D,IAAI,eAAe,SAAS,SAAS;AAAA,MACnC,OAAO;AAAA,IACT;AAAA,IAEA,IAAI,eAAe,SAAS,SAAS;AAAA,MACnC,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,aAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAGA,MAAM,iBAAiB,cAAc,eAAe,MAAM;AAAA,IAC1D,IAAI,eAAe,SAAS,SAAS;AAAA,MACnC,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,aAAa;AAAA,QAClB,SAAS,eAAe;AAAA,QACxB,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAGA,MAAM,iBACJ,KAAK,KAAK,WAAW,IACjB,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO,IACxC;AAAA,IAEN,IAAI,eAAe,SAAS,SAAS;AAAA,MACnC,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,iBAAiB,2BACrB,MACA,gBACA,CAAC,EAAE,aAAa,qBAAqB,eAAe,CAAC,GACrD,SACA,WACF;AAAA,IAEA,IAAI,eAAe,SAAS,WAAW,eAAe,SAAS,uBAAuB;AAAA,MACpF,OAAO;AAAA,IACT;AAAA,IAEA,OAAO,eAAe,eAAe,QAAQ,OAAO;AAAA;AAExD;",
|
|
8
|
+
"debugId": "4ABA08F6CF9EBBD864756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|