@devmm/puredocs-excel-formula 1.0.9 → 1.1.0

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/dist/index.cjs CHANGED
@@ -31,6 +31,13 @@ var FormulaError = /* @__PURE__ */ ((FormulaError2) => {
31
31
  FormulaError2[FormulaError2["Spill"] = 9] = "Spill";
32
32
  return FormulaError2;
33
33
  })(FormulaError || {});
34
+ var DECIMAL = /^[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?$/;
35
+ function numericText(text) {
36
+ const trimmed = text.trim();
37
+ if (!DECIMAL.test(trimmed)) return null;
38
+ const n = Number(trimmed);
39
+ return Number.isFinite(n) ? n : null;
40
+ }
34
41
  var TailCall = class {
35
42
  constructor(lambda, args) {
36
43
  this.lambda = lambda;
@@ -1443,6 +1450,7 @@ var indexes = /* @__PURE__ */ new WeakMap();
1443
1450
  function build(arr) {
1444
1451
  const byText = /* @__PURE__ */ new Map();
1445
1452
  const byNumber = /* @__PURE__ */ new Map();
1453
+ const byTextNumber = /* @__PURE__ */ new Map();
1446
1454
  const classes = /* @__PURE__ */ new Map();
1447
1455
  const addToClass = (kind, v, i2) => {
1448
1456
  const group = classes.get(kind);
@@ -1462,6 +1470,14 @@ function build(arr) {
1462
1470
  else byNumber.set(n, [i]);
1463
1471
  } else {
1464
1472
  addToClass(v.kind, v, i);
1473
+ if (v.isText) {
1474
+ const n = numericText(v.textValue);
1475
+ if (n !== null) {
1476
+ const atText2 = byTextNumber.get(n);
1477
+ if (atText2) atText2.push(i);
1478
+ else byTextNumber.set(n, [i]);
1479
+ }
1480
+ }
1465
1481
  }
1466
1482
  i++;
1467
1483
  }
@@ -1470,7 +1486,15 @@ function build(arr) {
1470
1486
  for (let k = 0; k < sortedNumbers.length; k++) {
1471
1487
  cumulative[k + 1] = cumulative[k] + byNumber.get(sortedNumbers[k]).length;
1472
1488
  }
1473
- return { byText, byNumber, sortedNumbers, cumulative, classes: [...classes.values()] };
1489
+ return {
1490
+ byText,
1491
+ byNumber,
1492
+ sortedNumbers,
1493
+ cumulative,
1494
+ byTextNumber,
1495
+ sortedTextNumbers: Float64Array.from(byTextNumber.keys()).sort(),
1496
+ classes: [...classes.values()]
1497
+ };
1474
1498
  }
1475
1499
  function indexOf(arr) {
1476
1500
  let idx = indexes.get(arr);
@@ -1508,19 +1532,25 @@ function matchingPositions(criteriaRange, criteria, minSize) {
1508
1532
  if (criteria.kind === "equalsNumber") {
1509
1533
  const target = criteria.number;
1510
1534
  const idx = indexOf(arr);
1511
- const exact2 = idx.byNumber.get(target);
1512
- let near;
1513
- const { sortedNumbers } = idx;
1514
- for (let k = lowerBound(sortedNumbers, target - EPSILON); k < sortedNumbers.length; k++) {
1515
- const value2 = sortedNumbers[k];
1516
- if (value2 > target + EPSILON) break;
1517
- if (value2 === target) continue;
1518
- if (!criteria.test(FormulaValue.number(value2))) continue;
1519
- (near ?? (near = [])).push(...idx.byNumber.get(value2));
1520
- }
1535
+ const groups = [];
1536
+ const collect = (byValue, sorted) => {
1537
+ const exact2 = byValue.get(target);
1538
+ if (exact2) groups.push(exact2);
1539
+ for (let k = lowerBound(sorted, target - EPSILON); k < sorted.length; k++) {
1540
+ const value2 = sorted[k];
1541
+ if (value2 > target + EPSILON) break;
1542
+ if (value2 === target) continue;
1543
+ if (!criteria.test(FormulaValue.number(value2))) continue;
1544
+ groups.push(byValue.get(value2));
1545
+ }
1546
+ };
1547
+ collect(idx.byNumber, idx.sortedNumbers);
1548
+ collect(idx.byTextNumber, idx.sortedTextNumbers);
1521
1549
  const blanks = criteria.test(FormulaValue.blank) ? blankPositions(idx) : void 0;
1522
- if (!near && !blanks?.length) return exact2 ?? EMPTY;
1523
- const merged = [...exact2 ?? EMPTY, ...near ?? EMPTY, ...blanks ?? EMPTY];
1550
+ if (blanks?.length) groups.push(blanks);
1551
+ if (groups.length === 0) return EMPTY;
1552
+ if (groups.length === 1) return groups[0];
1553
+ const merged = groups.flat();
1524
1554
  merged.sort((a, b) => a - b);
1525
1555
  return merged;
1526
1556
  }
@@ -4702,7 +4732,8 @@ exports.FormulaHelper = void 0;
4702
4732
  return rhsNum !== null ? numberEquality(rhsNum) : textEquality(rhs);
4703
4733
  }
4704
4734
  if (op === "<>") {
4705
- return { kind: "other", test: (v) => !FormulaValue.areEqual(v, rhsValue) };
4735
+ const equals = rhsNum !== null ? numberEquality(rhsNum) : textEquality(rhs);
4736
+ return { kind: "other", test: (v) => !equals.test(v) };
4706
4737
  }
4707
4738
  const wanted = op === ">" ? (c) => c > 0 : op === ">=" ? (c) => c >= 0 : op === "<" ? (c) => c < 0 : (c) => c <= 0;
4708
4739
  const test = (v) => wanted(FormulaValue.compare(v, rhsValue));
@@ -4718,7 +4749,16 @@ exports.FormulaHelper = void 0;
4718
4749
  FormulaHelper2.compileCriteria = compileCriteria;
4719
4750
  function numberEquality(n) {
4720
4751
  const target = FormulaValue.number(n);
4721
- return { kind: "equalsNumber", number: n, test: (v) => FormulaValue.areEqual(v, target) };
4752
+ return {
4753
+ kind: "equalsNumber",
4754
+ number: n,
4755
+ test: (v) => {
4756
+ if (FormulaValue.areEqual(v, target)) return true;
4757
+ if (!v.isText) return false;
4758
+ const asNumber = numericText(v.textValue);
4759
+ return asNumber !== null && Math.abs(asNumber - n) < 1e-10;
4760
+ }
4761
+ };
4722
4762
  }
4723
4763
  function textEquality(s) {
4724
4764
  const upper2 = s.toUpperCase();