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.
- package/dist/cjs/index.cjs +117 -38
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs-legacy/index.cjs +116 -37
- package/dist/cjs-legacy/index.cjs.map +1 -1
- package/dist/esm/index.mjs +117 -39
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm-legacy/index.mjs +116 -38
- package/dist/esm-legacy/index.mjs.map +1 -1
- package/dist/types/common/error.d.ts +23 -0
- package/dist/types/common/index.d.ts +1 -0
- package/dist/types/data-structures/binary-tree/binary-tree.d.ts +10 -0
- package/dist/types/data-structures/binary-tree/red-black-tree.d.ts +7 -1
- package/dist/types/data-structures/graph/abstract-graph.d.ts +44 -0
- package/dist/types/data-structures/graph/directed-graph.d.ts +1 -0
- package/dist/types/data-structures/graph/undirected-graph.d.ts +14 -0
- package/dist/types/data-structures/queue/deque.d.ts +41 -1
- package/dist/types/types/data-structures/queue/deque.d.ts +6 -0
- package/dist/umd/queue-typed.js +114 -35
- package/dist/umd/queue-typed.js.map +1 -1
- package/dist/umd/queue-typed.min.js +1 -1
- package/dist/umd/queue-typed.min.js.map +1 -1
- package/package.json +2 -2
- package/src/common/error.ts +60 -0
- package/src/common/index.ts +2 -0
- package/src/data-structures/base/iterable-element-base.ts +3 -2
- package/src/data-structures/binary-tree/binary-indexed-tree.ts +6 -5
- package/src/data-structures/binary-tree/binary-tree.ts +113 -42
- package/src/data-structures/binary-tree/bst.ts +11 -3
- package/src/data-structures/binary-tree/red-black-tree.ts +20 -0
- package/src/data-structures/binary-tree/tree-map.ts +8 -7
- package/src/data-structures/binary-tree/tree-multi-map.ts +4 -4
- package/src/data-structures/binary-tree/tree-multi-set.ts +5 -4
- package/src/data-structures/binary-tree/tree-set.ts +7 -6
- package/src/data-structures/graph/abstract-graph.ts +106 -1
- package/src/data-structures/graph/directed-graph.ts +4 -0
- package/src/data-structures/graph/undirected-graph.ts +95 -0
- package/src/data-structures/hash/hash-map.ts +13 -2
- package/src/data-structures/heap/heap.ts +4 -3
- package/src/data-structures/heap/max-heap.ts +2 -3
- package/src/data-structures/matrix/matrix.ts +9 -10
- package/src/data-structures/priority-queue/max-priority-queue.ts +2 -3
- package/src/data-structures/queue/deque.ts +71 -3
- package/src/data-structures/trie/trie.ts +2 -1
- package/src/types/data-structures/queue/deque.ts +7 -0
- 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
|
|
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(
|
|
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
|
|
1703
|
-
if (index < min || index > max)
|
|
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
|
|
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
|