queue-typed 2.4.4 → 2.4.5

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.
Files changed (45) hide show
  1. package/dist/cjs/index.cjs +117 -38
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/cjs-legacy/index.cjs +116 -37
  4. package/dist/cjs-legacy/index.cjs.map +1 -1
  5. package/dist/esm/index.mjs +117 -39
  6. package/dist/esm/index.mjs.map +1 -1
  7. package/dist/esm-legacy/index.mjs +116 -38
  8. package/dist/esm-legacy/index.mjs.map +1 -1
  9. package/dist/types/common/error.d.ts +23 -0
  10. package/dist/types/common/index.d.ts +1 -0
  11. package/dist/types/data-structures/binary-tree/binary-tree.d.ts +10 -0
  12. package/dist/types/data-structures/binary-tree/red-black-tree.d.ts +7 -1
  13. package/dist/types/data-structures/graph/abstract-graph.d.ts +44 -0
  14. package/dist/types/data-structures/graph/directed-graph.d.ts +1 -0
  15. package/dist/types/data-structures/graph/undirected-graph.d.ts +14 -0
  16. package/dist/types/data-structures/queue/deque.d.ts +41 -1
  17. package/dist/types/types/data-structures/queue/deque.d.ts +6 -0
  18. package/dist/umd/queue-typed.js +114 -35
  19. package/dist/umd/queue-typed.js.map +1 -1
  20. package/dist/umd/queue-typed.min.js +1 -1
  21. package/dist/umd/queue-typed.min.js.map +1 -1
  22. package/package.json +2 -2
  23. package/src/common/error.ts +60 -0
  24. package/src/common/index.ts +2 -0
  25. package/src/data-structures/base/iterable-element-base.ts +3 -2
  26. package/src/data-structures/binary-tree/binary-indexed-tree.ts +6 -5
  27. package/src/data-structures/binary-tree/binary-tree.ts +113 -42
  28. package/src/data-structures/binary-tree/bst.ts +11 -3
  29. package/src/data-structures/binary-tree/red-black-tree.ts +20 -0
  30. package/src/data-structures/binary-tree/tree-map.ts +8 -7
  31. package/src/data-structures/binary-tree/tree-multi-map.ts +4 -4
  32. package/src/data-structures/binary-tree/tree-multi-set.ts +5 -4
  33. package/src/data-structures/binary-tree/tree-set.ts +7 -6
  34. package/src/data-structures/graph/abstract-graph.ts +106 -1
  35. package/src/data-structures/graph/directed-graph.ts +4 -0
  36. package/src/data-structures/graph/undirected-graph.ts +95 -0
  37. package/src/data-structures/hash/hash-map.ts +13 -2
  38. package/src/data-structures/heap/heap.ts +4 -3
  39. package/src/data-structures/heap/max-heap.ts +2 -3
  40. package/src/data-structures/matrix/matrix.ts +9 -10
  41. package/src/data-structures/priority-queue/max-priority-queue.ts +2 -3
  42. package/src/data-structures/queue/deque.ts +71 -3
  43. package/src/data-structures/trie/trie.ts +2 -1
  44. package/src/types/data-structures/queue/deque.ts +7 -0
  45. package/src/utils/utils.ts +4 -2
@@ -3,6 +3,54 @@ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { en
3
3
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
4
4
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
5
 
6
+ // src/common/error.ts
7
+ var ERR = {
8
+ // Range / index
9
+ indexOutOfRange: /* @__PURE__ */ __name((index, min, max, ctx) => `${ctx ? ctx + ": " : ""}Index ${index} is out of range [${min}, ${max}].`, "indexOutOfRange"),
10
+ invalidIndex: /* @__PURE__ */ __name((ctx) => `${ctx ? ctx + ": " : ""}Index must be an integer.`, "invalidIndex"),
11
+ // Type / argument
12
+ invalidArgument: /* @__PURE__ */ __name((reason, ctx) => `${ctx ? ctx + ": " : ""}${reason}`, "invalidArgument"),
13
+ comparatorRequired: /* @__PURE__ */ __name((ctx) => `${ctx ? ctx + ": " : ""}Comparator is required for non-number/non-string/non-Date keys.`, "comparatorRequired"),
14
+ invalidKey: /* @__PURE__ */ __name((reason, ctx) => `${ctx ? ctx + ": " : ""}${reason}`, "invalidKey"),
15
+ notAFunction: /* @__PURE__ */ __name((name, ctx) => `${ctx ? ctx + ": " : ""}${name} must be a function.`, "notAFunction"),
16
+ invalidEntry: /* @__PURE__ */ __name((ctx) => `${ctx ? ctx + ": " : ""}Each entry must be a [key, value] tuple.`, "invalidEntry"),
17
+ invalidNaN: /* @__PURE__ */ __name((ctx) => `${ctx ? ctx + ": " : ""}NaN is not a valid key.`, "invalidNaN"),
18
+ invalidDate: /* @__PURE__ */ __name((ctx) => `${ctx ? ctx + ": " : ""}Invalid Date key.`, "invalidDate"),
19
+ reduceEmpty: /* @__PURE__ */ __name((ctx) => `${ctx ? ctx + ": " : ""}Reduce of empty structure with no initial value.`, "reduceEmpty"),
20
+ callbackReturnType: /* @__PURE__ */ __name((expected, got, ctx) => `${ctx ? ctx + ": " : ""}Callback must return ${expected}; got ${got}.`, "callbackReturnType"),
21
+ // State / operation
22
+ invalidOperation: /* @__PURE__ */ __name((reason, ctx) => `${ctx ? ctx + ": " : ""}${reason}`, "invalidOperation"),
23
+ // Matrix
24
+ matrixDimensionMismatch: /* @__PURE__ */ __name((op) => `Matrix: Dimensions must be compatible for ${op}.`, "matrixDimensionMismatch"),
25
+ matrixSingular: /* @__PURE__ */ __name(() => "Matrix: Singular matrix, inverse does not exist.", "matrixSingular"),
26
+ matrixNotSquare: /* @__PURE__ */ __name(() => "Matrix: Must be square for inversion.", "matrixNotSquare"),
27
+ matrixNotRectangular: /* @__PURE__ */ __name(() => "Matrix: Must be rectangular for transposition.", "matrixNotRectangular"),
28
+ matrixRowMismatch: /* @__PURE__ */ __name((expected, got) => `Matrix: Expected row length ${expected}, but got ${got}.`, "matrixRowMismatch")
29
+ };
30
+
31
+ // src/common/index.ts
32
+ var DFSOperation = /* @__PURE__ */ ((DFSOperation2) => {
33
+ DFSOperation2[DFSOperation2["VISIT"] = 0] = "VISIT";
34
+ DFSOperation2[DFSOperation2["PROCESS"] = 1] = "PROCESS";
35
+ return DFSOperation2;
36
+ })(DFSOperation || {});
37
+ var _Range = class _Range {
38
+ constructor(low, high, includeLow = true, includeHigh = true) {
39
+ this.low = low;
40
+ this.high = high;
41
+ this.includeLow = includeLow;
42
+ this.includeHigh = includeHigh;
43
+ }
44
+ // Determine whether a key is within the range
45
+ isInRange(key, comparator) {
46
+ const lowCheck = this.includeLow ? comparator(key, this.low) >= 0 : comparator(key, this.low) > 0;
47
+ const highCheck = this.includeHigh ? comparator(key, this.high) <= 0 : comparator(key, this.high) < 0;
48
+ return lowCheck && highCheck;
49
+ }
50
+ };
51
+ __name(_Range, "Range");
52
+ var Range = _Range;
53
+
6
54
  // src/data-structures/base/iterable-element-base.ts
7
55
  var _IterableElementBase = class _IterableElementBase {
8
56
  /**
@@ -25,7 +73,7 @@ var _IterableElementBase = class _IterableElementBase {
25
73
  if (options) {
26
74
  const { toElementFn } = options;
27
75
  if (typeof toElementFn === "function") this._toElementFn = toElementFn;
28
- else if (toElementFn) throw new TypeError("toElementFn must be a function type");
76
+ else if (toElementFn) throw new TypeError(ERR.notAFunction("toElementFn"));
29
77
  }
30
78
  }
31
79
  /**
@@ -181,7 +229,7 @@ var _IterableElementBase = class _IterableElementBase {
181
229
  acc = initialValue;
182
230
  } else {
183
231
  const first = iter.next();
184
- if (first.done) throw new TypeError("Reduce of empty structure with no initial value");
232
+ if (first.done) throw new TypeError(ERR.reduceEmpty());
185
233
  acc = first.value;
186
234
  index = 1;
187
235
  }
@@ -1699,24 +1747,25 @@ __name(_LinkedListQueue, "LinkedListQueue");
1699
1747
  var LinkedListQueue = _LinkedListQueue;
1700
1748
 
1701
1749
  // src/utils/utils.ts
1702
- var rangeCheck = /* @__PURE__ */ __name((index, min, max, message = "Index out of bounds.") => {
1703
- if (index < min || index > max) throw new RangeError(message);
1750
+ var rangeCheck = /* @__PURE__ */ __name((index, min, max, message) => {
1751
+ if (index < min || index > max) {
1752
+ throw new RangeError(message != null ? message : `Index ${index} is out of range [${min}, ${max}].`);
1753
+ }
1704
1754
  }, "rangeCheck");
1705
1755
  var calcMinUnitsRequired = /* @__PURE__ */ __name((totalQuantity, unitSize) => Math.floor((totalQuantity + unitSize - 1) / unitSize), "calcMinUnitsRequired");
1706
1756
 
1707
1757
  // src/data-structures/queue/deque.ts
1708
1758
  var _Deque = class _Deque extends LinearBase {
1709
- /**
1710
- * Create a Deque and optionally bulk-insert elements.
1711
- * @remarks Time O(N), Space O(N)
1712
- * @param [elements] - Iterable (or iterable-like) of elements/records to insert.
1713
- * @param [options] - Options such as bucketSize, toElementFn, and maxLen.
1714
- * @returns New Deque instance.
1715
- */
1716
1759
  constructor(elements = [], options) {
1717
1760
  super(options);
1718
1761
  __publicField(this, "_equals", /* @__PURE__ */ __name((a, b) => Object.is(a, b), "_equals"));
1719
1762
  __publicField(this, "_bucketSize", 1 << 12);
1763
+ __publicField(this, "_autoCompactRatio", 0.5);
1764
+ /**
1765
+ * Counter for shift/pop operations since last compaction check.
1766
+ * Only checks ratio every `_bucketSize` operations to minimize overhead.
1767
+ */
1768
+ __publicField(this, "_compactCounter", 0);
1720
1769
  __publicField(this, "_bucketFirst", 0);
1721
1770
  __publicField(this, "_firstInBucket", 0);
1722
1771
  __publicField(this, "_bucketLast", 0);
@@ -1725,8 +1774,9 @@ var _Deque = class _Deque extends LinearBase {
1725
1774
  __publicField(this, "_buckets", []);
1726
1775
  __publicField(this, "_length", 0);
1727
1776
  if (options) {
1728
- const { bucketSize } = options;
1777
+ const { bucketSize, autoCompactRatio } = options;
1729
1778
  if (typeof bucketSize === "number") this._bucketSize = bucketSize;
1779
+ if (typeof autoCompactRatio === "number") this._autoCompactRatio = autoCompactRatio;
1730
1780
  }
1731
1781
  let _size;
1732
1782
  if ("length" in elements) {
@@ -1751,6 +1801,24 @@ var _Deque = class _Deque extends LinearBase {
1751
1801
  get bucketSize() {
1752
1802
  return this._bucketSize;
1753
1803
  }
1804
+ /**
1805
+ * Get the auto-compaction ratio.
1806
+ * When `elements / (bucketCount * bucketSize)` drops below this ratio after
1807
+ * enough shift/pop operations, the deque auto-compacts.
1808
+ * @remarks Time O(1), Space O(1)
1809
+ * @returns Current ratio threshold. 0 means auto-compact is disabled.
1810
+ */
1811
+ get autoCompactRatio() {
1812
+ return this._autoCompactRatio;
1813
+ }
1814
+ /**
1815
+ * Set the auto-compaction ratio.
1816
+ * @remarks Time O(1), Space O(1)
1817
+ * @param value - Ratio in [0,1]. 0 disables auto-compact.
1818
+ */
1819
+ set autoCompactRatio(value) {
1820
+ this._autoCompactRatio = value;
1821
+ }
1754
1822
  /**
1755
1823
  * Get the index of the first bucket in use.
1756
1824
  * @remarks Time O(1), Space O(1)
@@ -1882,6 +1950,7 @@ var _Deque = class _Deque extends LinearBase {
1882
1950
  }
1883
1951
  }
1884
1952
  this._length -= 1;
1953
+ this._autoCompact();
1885
1954
  return element;
1886
1955
  }
1887
1956
  /**
@@ -1904,6 +1973,7 @@ var _Deque = class _Deque extends LinearBase {
1904
1973
  }
1905
1974
  }
1906
1975
  this._length -= 1;
1976
+ this._autoCompact();
1907
1977
  return element;
1908
1978
  }
1909
1979
  /**
@@ -2236,11 +2306,40 @@ var _Deque = class _Deque extends LinearBase {
2236
2306
  * @remarks Time O(N), Space O(1)
2237
2307
  * @returns void
2238
2308
  */
2309
+ /**
2310
+ * (Protected) Trigger auto-compaction if space utilization drops below threshold.
2311
+ * Only checks every `_bucketSize` operations to minimize hot-path overhead.
2312
+ * Uses element-based ratio: `elements / (bucketCount * bucketSize)`.
2313
+ */
2314
+ _autoCompact() {
2315
+ if (this._autoCompactRatio <= 0 || this._bucketCount <= 1) return;
2316
+ this._compactCounter++;
2317
+ if (this._compactCounter < this._bucketSize) return;
2318
+ this._compactCounter = 0;
2319
+ const utilization = this._length / (this._bucketCount * this._bucketSize);
2320
+ if (utilization < this._autoCompactRatio) {
2321
+ this.shrinkToFit();
2322
+ }
2323
+ }
2324
+ /**
2325
+ * Compact the deque by removing unused buckets.
2326
+ * @remarks Time O(N), Space O(1)
2327
+ * @returns True if compaction was performed (bucket count reduced).
2328
+ */
2329
+ /**
2330
+ * Compact the deque by removing unused buckets.
2331
+ * @remarks Time O(N), Space O(1)
2332
+ * @returns True if compaction was performed (bucket count reduced).
2333
+ */
2334
+ compact() {
2335
+ const before = this._bucketCount;
2336
+ this.shrinkToFit();
2337
+ return this._bucketCount < before;
2338
+ }
2239
2339
  shrinkToFit() {
2240
2340
  if (this._length === 0) return;
2241
2341
  const newBuckets = [];
2242
- if (this._bucketFirst === this._bucketLast) return;
2243
- else if (this._bucketFirst < this._bucketLast) {
2342
+ if (this._bucketFirst <= this._bucketLast) {
2244
2343
  for (let i = this._bucketFirst; i <= this._bucketLast; ++i) {
2245
2344
  newBuckets.push(this._buckets[i]);
2246
2345
  }
@@ -2255,6 +2354,8 @@ var _Deque = class _Deque extends LinearBase {
2255
2354
  this._bucketFirst = 0;
2256
2355
  this._bucketLast = newBuckets.length - 1;
2257
2356
  this._buckets = newBuckets;
2357
+ this._bucketCount = newBuckets.length;
2358
+ this._compactCounter = 0;
2258
2359
  }
2259
2360
  /**
2260
2361
  * Deep clone this deque, preserving options.
@@ -2436,29 +2537,6 @@ var _Deque = class _Deque extends LinearBase {
2436
2537
  };
2437
2538
  __name(_Deque, "Deque");
2438
2539
  var Deque = _Deque;
2439
-
2440
- // src/common/index.ts
2441
- var DFSOperation = /* @__PURE__ */ ((DFSOperation2) => {
2442
- DFSOperation2[DFSOperation2["VISIT"] = 0] = "VISIT";
2443
- DFSOperation2[DFSOperation2["PROCESS"] = 1] = "PROCESS";
2444
- return DFSOperation2;
2445
- })(DFSOperation || {});
2446
- var _Range = class _Range {
2447
- constructor(low, high, includeLow = true, includeHigh = true) {
2448
- this.low = low;
2449
- this.high = high;
2450
- this.includeLow = includeLow;
2451
- this.includeHigh = includeHigh;
2452
- }
2453
- // Determine whether a key is within the range
2454
- isInRange(key, comparator) {
2455
- const lowCheck = this.includeLow ? comparator(key, this.low) >= 0 : comparator(key, this.low) > 0;
2456
- const highCheck = this.includeHigh ? comparator(key, this.high) <= 0 : comparator(key, this.high) < 0;
2457
- return lowCheck && highCheck;
2458
- }
2459
- };
2460
- __name(_Range, "Range");
2461
- var Range = _Range;
2462
2540
  /**
2463
2541
  * data-structure-typed
2464
2542
  *
@@ -2467,6 +2545,6 @@ var Range = _Range;
2467
2545
  * @license MIT License
2468
2546
  */
2469
2547
 
2470
- export { DFSOperation, Deque, LinkedListQueue, Queue, Range };
2548
+ export { DFSOperation, Deque, ERR, LinkedListQueue, Queue, Range };
2471
2549
  //# sourceMappingURL=index.mjs.map
2472
2550
  //# sourceMappingURL=index.mjs.map