typescript-dsa-stl 1.2.3 → 1.4.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/README.md +69 -4
- package/dist/collections/OrderedMap.d.ts +3 -5
- package/dist/collections/OrderedMap.d.ts.map +1 -1
- package/dist/collections/OrderedMap.js +16 -41
- package/dist/collections/OrderedMap.js.map +1 -1
- package/dist/collections/OrderedMultiMap.d.ts +33 -0
- package/dist/collections/OrderedMultiMap.d.ts.map +1 -0
- package/dist/collections/OrderedMultiMap.js +90 -0
- package/dist/collections/OrderedMultiMap.js.map +1 -0
- package/dist/collections/OrderedMultiSet.d.ts +24 -0
- package/dist/collections/OrderedMultiSet.d.ts.map +1 -0
- package/dist/collections/OrderedMultiSet.js +47 -0
- package/dist/collections/OrderedMultiSet.js.map +1 -0
- package/dist/collections/OrderedSet.d.ts +3 -5
- package/dist/collections/OrderedSet.d.ts.map +1 -1
- package/dist/collections/OrderedSet.js +13 -32
- package/dist/collections/OrderedSet.js.map +1 -1
- package/dist/collections/RedBlackTree.d.ts +74 -0
- package/dist/collections/RedBlackTree.d.ts.map +1 -0
- package/dist/collections/RedBlackTree.js +414 -0
- package/dist/collections/RedBlackTree.js.map +1 -0
- package/dist/collections/index.d.ts +3 -0
- package/dist/collections/index.d.ts.map +1 -1
- package/dist/collections/index.js +3 -0
- package/dist/collections/index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +5 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
**This is the GitHub repository** for the npm package **[typescript-dsa-stl](https://www.npmjs.com/package/typescript-dsa-stl)**.
|
|
4
4
|
|
|
5
|
-
STL-style data structures and algorithms for TypeScript: **Vector**, **Stack**, **Queue**, **List**, **PriorityQueue**, **OrderedMap** (Map), **UnorderedMap**, **OrderedSet** (Set), **UnorderedSet**, and algorithms (`sort`, `binarySearch`, `lowerBound`, `min`, `max`, etc.). Install from npm to use in your project; this repo holds the source code.
|
|
5
|
+
STL-style data structures and algorithms for TypeScript: **Vector**, **Stack**, **Queue**, **List**, **PriorityQueue**, **OrderedMap** (Map), **UnorderedMap**, **OrderedSet** (Set), **UnorderedSet**, **OrderedMultiMap**, **OrderedMultiSet**, and algorithms (`sort`, `binarySearch`, `lowerBound`, `min`, `max`, etc.). Install from npm to use in your project; this repo holds the source code.
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -27,6 +27,8 @@ import {
|
|
|
27
27
|
UnorderedMap,
|
|
28
28
|
OrderedSet,
|
|
29
29
|
UnorderedSet,
|
|
30
|
+
OrderedMultiMap,
|
|
31
|
+
OrderedMultiSet,
|
|
30
32
|
sort,
|
|
31
33
|
find,
|
|
32
34
|
binarySearch,
|
|
@@ -72,6 +74,17 @@ console.log(map.get('a')); // 1
|
|
|
72
74
|
const set = new UnorderedSet<number>([1, 2, 2, 3]);
|
|
73
75
|
console.log(set.size); // 3
|
|
74
76
|
|
|
77
|
+
// OrderedMultiSet (sorted, duplicates allowed)
|
|
78
|
+
const multiSet = new OrderedMultiSet<number>();
|
|
79
|
+
multiSet.add(3); multiSet.add(1); multiSet.add(2); multiSet.add(2);
|
|
80
|
+
console.log(multiSet.toArray()); // [1, 2, 2, 3]
|
|
81
|
+
console.log(multiSet.count(2)); // 2
|
|
82
|
+
|
|
83
|
+
// OrderedMultiMap (one key → multiple values, keys sorted)
|
|
84
|
+
const multiMap = new OrderedMultiMap<string, number>();
|
|
85
|
+
multiMap.set('scores', 90); multiMap.set('scores', 85); multiMap.set('scores', 95);
|
|
86
|
+
console.log(multiMap.getAll('scores')); // [90, 85, 95]
|
|
87
|
+
|
|
75
88
|
// Algorithms (work on arrays and iterables)
|
|
76
89
|
const arr = [3, 1, 4, 1, 5];
|
|
77
90
|
sort(arr); // [1, 1, 3, 4, 5]
|
|
@@ -137,7 +150,7 @@ cube.at(0).at(1).at(0); // 3 (layer 0, row 1, col 0)
|
|
|
137
150
|
|
|
138
151
|
| Module | Exports |
|
|
139
152
|
|--------|--------|
|
|
140
|
-
| **Collections** | `Vector`, `Stack`, `Queue`, `List`, `ListNode`, `PriorityQueue`, `OrderedMap`, `UnorderedMap`, `OrderedSet`, `UnorderedSet` |
|
|
153
|
+
| **Collections** | `Vector`, `Stack`, `Queue`, `List`, `ListNode`, `PriorityQueue`, `OrderedMap`, `UnorderedMap`, `OrderedSet`, `UnorderedSet`, `OrderedMultiMap`, `OrderedMultiSet` |
|
|
141
154
|
| **Algorithms** | `sort`, `find`, `findIndex`, `transform`, `filter`, `reduce`, `reverse`, `unique`, `binarySearch`, `lowerBound`, `upperBound`, `min`, `max`, `partition` |
|
|
142
155
|
| **Utils** | `clamp`, `range`, `noop`, `identity`, `swap` |
|
|
143
156
|
| **Types** | `Comparator`, `Predicate`, `UnaryFn`, `Reducer`, `IterableLike`, `toArray` |
|
|
@@ -162,16 +175,68 @@ import type { Comparator } from 'typescript-dsa-stl/types';
|
|
|
162
175
|
| **Queue** | — | O(1)* | — | O(1)* | — |
|
|
163
176
|
| **List** | O(n) | O(1) | O(1)** | O(1) | O(1)** |
|
|
164
177
|
| **PriorityQueue** | — | O(log n) | — | O(log n) | — |
|
|
165
|
-
| **OrderedMap** (Map) | O(log n) get | O(n) set | — | O(n) delete | — |
|
|
178
|
+
| **OrderedMap** (Map) | O(log n) get | O(log n) set | — | O(log n) delete | — |
|
|
166
179
|
| **UnorderedMap** | O(1)* get/set | O(1)* | — | O(1)* delete | — |
|
|
167
|
-
| **OrderedSet** (Set) | O(log n) has | O(n) add | — | O(n) delete | — |
|
|
180
|
+
| **OrderedSet** (Set) | O(log n) has | O(log n) add | — | O(log n) delete | — |
|
|
168
181
|
| **UnorderedSet** | O(1)* has/add | O(1)* | — | O(1)* delete | — |
|
|
182
|
+
| **OrderedMultiMap** | O(log n) get | O(log n) set | — | O(log n) delete | — |
|
|
183
|
+
| **OrderedMultiSet** | O(log n) has/count | O(log n) add | — | O(log n) delete | — |
|
|
169
184
|
|
|
170
185
|
\* Amortized (hash).
|
|
171
186
|
\** At a known node.
|
|
172
187
|
|
|
173
188
|
---
|
|
174
189
|
|
|
190
|
+
## OrderedMultiMap and OrderedMultiSet — use cases
|
|
191
|
+
|
|
192
|
+
**OrderedMultiSet** is a sorted collection that allows duplicate elements (like C++ `std::multiset`). Use it when you need ordering and multiple copies of the same value.
|
|
193
|
+
|
|
194
|
+
| Use case | Example |
|
|
195
|
+
|----------|---------|
|
|
196
|
+
| **Sorted runs / leaderboard with ties** | Store scores; multiple users can have the same score. Iterate in sorted order, use `count(score)` for ties. |
|
|
197
|
+
| **Event timeline with repeated timestamps** | Add events by time; several events can share the same time. `add(timestamp)`, iterate in order. |
|
|
198
|
+
| **K-th smallest in a multiset** | Keep elements sorted; k-th element is at index `k - 1` in iteration. |
|
|
199
|
+
| **Range counts** | Combined with binary search ideas: count elements in `[low, high]` using `count` and iteration. |
|
|
200
|
+
|
|
201
|
+
**OrderedMultiMap** maps one key to multiple values while keeping keys sorted (like C++ `std::multimap`). Use it when a key can have several associated values and you need key order.
|
|
202
|
+
|
|
203
|
+
| Use case | Example |
|
|
204
|
+
|----------|---------|
|
|
205
|
+
| **Inverted index** | Key = term, values = document IDs containing that term. `set(term, docId)` for each occurrence; `getAll(term)` returns all doc IDs. |
|
|
206
|
+
| **Grouping by key** | Key = category, values = items. `set(category, item)`; iterate keys in order, use `getAll(key)` per group. |
|
|
207
|
+
| **One-to-many relations** | Key = user ID, values = session IDs. `set(userId, sessionId)`; `getAll(userId)` lists all sessions. |
|
|
208
|
+
| **Time-series by bucket** | Key = time bucket, values = events. Sorted keys give chronological buckets; `getAll(bucket)` gets events in that bucket. |
|
|
209
|
+
|
|
210
|
+
### OrderedMultiSet example
|
|
211
|
+
|
|
212
|
+
```ts
|
|
213
|
+
import { OrderedMultiSet } from 'typescript-dsa-stl';
|
|
214
|
+
|
|
215
|
+
const scores = new OrderedMultiSet<number>();
|
|
216
|
+
scores.add(85); scores.add(92); scores.add(85); scores.add(78);
|
|
217
|
+
console.log(scores.toArray()); // [78, 85, 85, 92]
|
|
218
|
+
console.log(scores.count(85)); // 2
|
|
219
|
+
scores.delete(85); // remove one 85
|
|
220
|
+
console.log(scores.count(85)); // 1
|
|
221
|
+
scores.deleteAll(85); // remove all 85s
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### OrderedMultiMap example
|
|
225
|
+
|
|
226
|
+
```ts
|
|
227
|
+
import { OrderedMultiMap } from 'typescript-dsa-stl';
|
|
228
|
+
|
|
229
|
+
const index = new OrderedMultiMap<string, number>(); // term -> doc IDs
|
|
230
|
+
index.set('typescript', 1); index.set('typescript', 3); index.set('stl', 2);
|
|
231
|
+
console.log(index.getAll('typescript')); // [1, 3]
|
|
232
|
+
console.log(index.get('stl')); // 2
|
|
233
|
+
for (const [key, value] of index) {
|
|
234
|
+
console.log(key, value); // keys in sorted order
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
175
240
|
## For maintainers
|
|
176
241
|
|
|
177
242
|
- **Build:** `npm run build` (also runs before `npm publish` via `prepublishOnly`)
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Ordered map (STL-style map). Keys sorted by comparator.
|
|
3
|
-
* Implemented with a
|
|
2
|
+
* Ordered map (STL-style map). Keys sorted by comparator.
|
|
3
|
+
* O(log n) get/set/has/delete. Implemented with a Red-Black tree.
|
|
4
4
|
*/
|
|
5
5
|
import type { Comparator } from '../types/index.js';
|
|
6
6
|
export declare class OrderedMap<K, V> {
|
|
7
|
-
private
|
|
8
|
-
private _compare;
|
|
7
|
+
private _tree;
|
|
9
8
|
constructor(compare?: Comparator<K>);
|
|
10
9
|
get size(): number;
|
|
11
10
|
get empty(): boolean;
|
|
12
|
-
private _lowerBound;
|
|
13
11
|
get(key: K): V | undefined;
|
|
14
12
|
set(key: K, value: V): void;
|
|
15
13
|
has(key: K): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OrderedMap.d.ts","sourceRoot":"","sources":["../../src/collections/OrderedMap.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"OrderedMap.d.ts","sourceRoot":"","sources":["../../src/collections/OrderedMap.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAOpD,qBAAa,UAAU,CAAC,CAAC,EAAE,CAAC;IAC1B,OAAO,CAAC,KAAK,CAAqB;gBAEtB,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IAOnC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAI1B,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAI3B,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAIpB,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAIvB,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC;IAInB,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC;IAIrB,OAAO,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAI3B,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAGtC"}
|
|
@@ -1,71 +1,46 @@
|
|
|
1
|
+
import { RedBlackTree } from './RedBlackTree.js';
|
|
1
2
|
function defaultCompare(a, b) {
|
|
2
3
|
return a < b ? -1 : a > b ? 1 : 0;
|
|
3
4
|
}
|
|
4
5
|
export class OrderedMap {
|
|
5
6
|
constructor(compare) {
|
|
6
|
-
this.
|
|
7
|
-
|
|
7
|
+
this._tree = new RedBlackTree({
|
|
8
|
+
compare: compare ?? defaultCompare,
|
|
9
|
+
allowDuplicateKeys: false,
|
|
10
|
+
});
|
|
8
11
|
}
|
|
9
12
|
get size() {
|
|
10
|
-
return this.
|
|
13
|
+
return this._tree.size;
|
|
11
14
|
}
|
|
12
15
|
get empty() {
|
|
13
|
-
return this.
|
|
14
|
-
}
|
|
15
|
-
_lowerBound(key) {
|
|
16
|
-
const cmp = this._compare;
|
|
17
|
-
let lo = 0;
|
|
18
|
-
let hi = this._entries.length;
|
|
19
|
-
while (lo < hi) {
|
|
20
|
-
const mid = (lo + hi) >>> 1;
|
|
21
|
-
if (cmp(this._entries[mid][0], key) < 0)
|
|
22
|
-
lo = mid + 1;
|
|
23
|
-
else
|
|
24
|
-
hi = mid;
|
|
25
|
-
}
|
|
26
|
-
return lo;
|
|
16
|
+
return this._tree.empty;
|
|
27
17
|
}
|
|
28
18
|
get(key) {
|
|
29
|
-
|
|
30
|
-
if (i < this._entries.length && this._compare(this._entries[i][0], key) === 0) {
|
|
31
|
-
return this._entries[i][1];
|
|
32
|
-
}
|
|
33
|
-
return undefined;
|
|
19
|
+
return this._tree.get(key);
|
|
34
20
|
}
|
|
35
21
|
set(key, value) {
|
|
36
|
-
|
|
37
|
-
if (i < this._entries.length && this._compare(this._entries[i][0], key) === 0) {
|
|
38
|
-
this._entries[i][1] = value;
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
this._entries.splice(i, 0, [key, value]);
|
|
42
|
-
}
|
|
22
|
+
this._tree.set(key, value);
|
|
43
23
|
}
|
|
44
24
|
has(key) {
|
|
45
|
-
return this.
|
|
25
|
+
return this._tree.has(key);
|
|
46
26
|
}
|
|
47
27
|
delete(key) {
|
|
48
|
-
|
|
49
|
-
if (i < this._entries.length && this._compare(this._entries[i][0], key) === 0) {
|
|
50
|
-
this._entries.splice(i, 1);
|
|
51
|
-
return true;
|
|
52
|
-
}
|
|
53
|
-
return false;
|
|
28
|
+
return this._tree.deleteKey(key);
|
|
54
29
|
}
|
|
55
30
|
clear() {
|
|
56
|
-
this.
|
|
31
|
+
this._tree.clear();
|
|
57
32
|
}
|
|
58
33
|
keys() {
|
|
59
|
-
return this.
|
|
34
|
+
return this._tree.keys();
|
|
60
35
|
}
|
|
61
36
|
values() {
|
|
62
|
-
return this.
|
|
37
|
+
return this._tree.values();
|
|
63
38
|
}
|
|
64
39
|
entries() {
|
|
65
|
-
return this.
|
|
40
|
+
return this._tree.entries();
|
|
66
41
|
}
|
|
67
42
|
[Symbol.iterator]() {
|
|
68
|
-
return this.
|
|
43
|
+
return this._tree.entries();
|
|
69
44
|
}
|
|
70
45
|
}
|
|
71
46
|
//# sourceMappingURL=OrderedMap.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OrderedMap.js","sourceRoot":"","sources":["../../src/collections/OrderedMap.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"OrderedMap.js","sourceRoot":"","sources":["../../src/collections/OrderedMap.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,SAAS,cAAc,CAAI,CAAI,EAAE,CAAI;IACnC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,OAAO,UAAU;IAGrB,YAAY,OAAuB;QACjC,IAAI,CAAC,KAAK,GAAG,IAAI,YAAY,CAAO;YAClC,OAAO,EAAE,OAAO,IAAI,cAAc;YAClC,kBAAkB,EAAE,KAAK;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IAC1B,CAAC;IAED,GAAG,CAAC,GAAM;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,GAAG,CAAC,GAAM,EAAE,KAAQ;QAClB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,GAAG,CAAC,GAAM;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,GAAM;QACX,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC;IAED,CAAC,MAAM,CAAC,QAAQ,CAAC;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC;CACF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ordered multimap (STL-style multimap). Keys sorted by comparator; one key can have multiple values.
|
|
3
|
+
* O(log n) get/set/has/delete. Implemented with a Red-Black tree (duplicate keys allowed).
|
|
4
|
+
*/
|
|
5
|
+
import type { Comparator } from '../types/index.js';
|
|
6
|
+
export declare class OrderedMultiMap<K, V> {
|
|
7
|
+
private _tree;
|
|
8
|
+
private _compare;
|
|
9
|
+
constructor(compare?: Comparator<K>);
|
|
10
|
+
get size(): number;
|
|
11
|
+
get empty(): boolean;
|
|
12
|
+
/** First value for key, or undefined. */
|
|
13
|
+
get(key: K): V | undefined;
|
|
14
|
+
/** All values for key (in order). */
|
|
15
|
+
getAll(key: K): V[];
|
|
16
|
+
/** Add a key-value pair (duplicate keys allowed). */
|
|
17
|
+
set(key: K, value: V): void;
|
|
18
|
+
has(key: K): boolean;
|
|
19
|
+
/** True if the pair (key, value) exists. */
|
|
20
|
+
hasEntry(key: K, value: V): boolean;
|
|
21
|
+
/** Number of pairs with this key. */
|
|
22
|
+
count(key: K): number;
|
|
23
|
+
/** Remove one pair for key (first). If value is given, remove that pair. Returns true if removed. */
|
|
24
|
+
delete(key: K, value?: V): boolean;
|
|
25
|
+
/** Remove all pairs for key. Returns count removed. */
|
|
26
|
+
deleteAll(key: K): number;
|
|
27
|
+
clear(): void;
|
|
28
|
+
keys(): Iterable<K>;
|
|
29
|
+
values(): Iterable<V>;
|
|
30
|
+
entries(): Iterable<[K, V]>;
|
|
31
|
+
[Symbol.iterator](): Iterator<[K, V]>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=OrderedMultiMap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrderedMultiMap.d.ts","sourceRoot":"","sources":["../../src/collections/OrderedMultiMap.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAOpD,qBAAa,eAAe,CAAC,CAAC,EAAE,CAAC;IAC/B,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,QAAQ,CAAgB;gBAEpB,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IAQnC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,yCAAyC;IACzC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAK1B,qCAAqC;IACrC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE;IAUnB,qDAAqD;IACrD,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAI3B,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAIpB,4CAA4C;IAC5C,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO;IASnC,qCAAqC;IACrC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM;IAIrB,qGAAqG;IACrG,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,OAAO;IAelC,uDAAuD;IACvD,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM;IAIzB,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC;IAInB,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC;IAIrB,OAAO,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAI3B,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAGtC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { RedBlackTree } from './RedBlackTree.js';
|
|
2
|
+
function defaultCompare(a, b) {
|
|
3
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
4
|
+
}
|
|
5
|
+
export class OrderedMultiMap {
|
|
6
|
+
constructor(compare) {
|
|
7
|
+
this._compare = compare ?? defaultCompare;
|
|
8
|
+
this._tree = new RedBlackTree({
|
|
9
|
+
compare: this._compare,
|
|
10
|
+
allowDuplicateKeys: true,
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
get size() {
|
|
14
|
+
return this._tree.size;
|
|
15
|
+
}
|
|
16
|
+
get empty() {
|
|
17
|
+
return this._tree.empty;
|
|
18
|
+
}
|
|
19
|
+
/** First value for key, or undefined. */
|
|
20
|
+
get(key) {
|
|
21
|
+
const node = this._tree.find(key);
|
|
22
|
+
return node ? node.value : undefined;
|
|
23
|
+
}
|
|
24
|
+
/** All values for key (in order). */
|
|
25
|
+
getAll(key) {
|
|
26
|
+
const out = [];
|
|
27
|
+
let node = this._tree.lowerBound(key);
|
|
28
|
+
while (node !== null && this._compare(node.key, key) === 0) {
|
|
29
|
+
out.push(node.value);
|
|
30
|
+
node = this._tree.successor(node);
|
|
31
|
+
}
|
|
32
|
+
return out;
|
|
33
|
+
}
|
|
34
|
+
/** Add a key-value pair (duplicate keys allowed). */
|
|
35
|
+
set(key, value) {
|
|
36
|
+
this._tree.set(key, value);
|
|
37
|
+
}
|
|
38
|
+
has(key) {
|
|
39
|
+
return this._tree.has(key);
|
|
40
|
+
}
|
|
41
|
+
/** True if the pair (key, value) exists. */
|
|
42
|
+
hasEntry(key, value) {
|
|
43
|
+
let node = this._tree.lowerBound(key);
|
|
44
|
+
while (node !== null && this._compare(node.key, key) === 0) {
|
|
45
|
+
if (node.value === value)
|
|
46
|
+
return true;
|
|
47
|
+
node = this._tree.successor(node);
|
|
48
|
+
}
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
/** Number of pairs with this key. */
|
|
52
|
+
count(key) {
|
|
53
|
+
return this._tree.count(key);
|
|
54
|
+
}
|
|
55
|
+
/** Remove one pair for key (first). If value is given, remove that pair. Returns true if removed. */
|
|
56
|
+
delete(key, value) {
|
|
57
|
+
if (value === undefined) {
|
|
58
|
+
return this._tree.deleteKey(key);
|
|
59
|
+
}
|
|
60
|
+
let node = this._tree.lowerBound(key);
|
|
61
|
+
while (node !== null && this._compare(node.key, key) === 0) {
|
|
62
|
+
if (node.value === value) {
|
|
63
|
+
this._tree.deleteNode(node);
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
node = this._tree.successor(node);
|
|
67
|
+
}
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
/** Remove all pairs for key. Returns count removed. */
|
|
71
|
+
deleteAll(key) {
|
|
72
|
+
return this._tree.deleteAllKeys(key);
|
|
73
|
+
}
|
|
74
|
+
clear() {
|
|
75
|
+
this._tree.clear();
|
|
76
|
+
}
|
|
77
|
+
keys() {
|
|
78
|
+
return this._tree.keys();
|
|
79
|
+
}
|
|
80
|
+
values() {
|
|
81
|
+
return this._tree.values();
|
|
82
|
+
}
|
|
83
|
+
entries() {
|
|
84
|
+
return this._tree.entries();
|
|
85
|
+
}
|
|
86
|
+
[Symbol.iterator]() {
|
|
87
|
+
return this._tree.entries();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=OrderedMultiMap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrderedMultiMap.js","sourceRoot":"","sources":["../../src/collections/OrderedMultiMap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ordered multiset (STL-style multiset). Elements sorted by comparator; duplicates allowed.
|
|
3
|
+
* O(log n) has/count/add/delete. Implemented with a Red-Black tree (duplicate keys allowed).
|
|
4
|
+
*/
|
|
5
|
+
import type { Comparator } from '../types/index.js';
|
|
6
|
+
export declare class OrderedMultiSet<T> {
|
|
7
|
+
private _tree;
|
|
8
|
+
constructor(compare?: Comparator<T>);
|
|
9
|
+
get size(): number;
|
|
10
|
+
get empty(): boolean;
|
|
11
|
+
has(value: T): boolean;
|
|
12
|
+
/** Number of elements equal to value. */
|
|
13
|
+
count(value: T): number;
|
|
14
|
+
/** Insert value (duplicates allowed). */
|
|
15
|
+
add(value: T): void;
|
|
16
|
+
/** Remove one occurrence of value. Returns true if removed. */
|
|
17
|
+
delete(value: T): boolean;
|
|
18
|
+
/** Remove all occurrences of value. Returns count removed. */
|
|
19
|
+
deleteAll(value: T): number;
|
|
20
|
+
clear(): void;
|
|
21
|
+
[Symbol.iterator](): Iterator<T>;
|
|
22
|
+
toArray(): T[];
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=OrderedMultiSet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrderedMultiSet.d.ts","sourceRoot":"","sources":["../../src/collections/OrderedMultiSet.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAOpD,qBAAa,eAAe,CAAC,CAAC;IAC5B,OAAO,CAAC,KAAK,CAAqB;gBAEtB,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IAOnC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO;IAItB,yCAAyC;IACzC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM;IAIvB,yCAAyC;IACzC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAInB,+DAA+D;IAC/D,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO;IAIzB,8DAA8D;IAC9D,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM;IAI3B,KAAK,IAAI,IAAI;IAIb,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC;IAIhC,OAAO,IAAI,CAAC,EAAE;CAGf"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { RedBlackTree } from './RedBlackTree.js';
|
|
2
|
+
function defaultCompare(a, b) {
|
|
3
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
4
|
+
}
|
|
5
|
+
export class OrderedMultiSet {
|
|
6
|
+
constructor(compare) {
|
|
7
|
+
this._tree = new RedBlackTree({
|
|
8
|
+
compare: compare ?? defaultCompare,
|
|
9
|
+
allowDuplicateKeys: true,
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
get size() {
|
|
13
|
+
return this._tree.size;
|
|
14
|
+
}
|
|
15
|
+
get empty() {
|
|
16
|
+
return this._tree.empty;
|
|
17
|
+
}
|
|
18
|
+
has(value) {
|
|
19
|
+
return this._tree.has(value);
|
|
20
|
+
}
|
|
21
|
+
/** Number of elements equal to value. */
|
|
22
|
+
count(value) {
|
|
23
|
+
return this._tree.count(value);
|
|
24
|
+
}
|
|
25
|
+
/** Insert value (duplicates allowed). */
|
|
26
|
+
add(value) {
|
|
27
|
+
this._tree.set(value, value);
|
|
28
|
+
}
|
|
29
|
+
/** Remove one occurrence of value. Returns true if removed. */
|
|
30
|
+
delete(value) {
|
|
31
|
+
return this._tree.deleteKey(value);
|
|
32
|
+
}
|
|
33
|
+
/** Remove all occurrences of value. Returns count removed. */
|
|
34
|
+
deleteAll(value) {
|
|
35
|
+
return this._tree.deleteAllKeys(value);
|
|
36
|
+
}
|
|
37
|
+
clear() {
|
|
38
|
+
this._tree.clear();
|
|
39
|
+
}
|
|
40
|
+
[Symbol.iterator]() {
|
|
41
|
+
return this._tree.keys();
|
|
42
|
+
}
|
|
43
|
+
toArray() {
|
|
44
|
+
return [...this._tree.keys()];
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=OrderedMultiSet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrderedMultiSet.js","sourceRoot":"","sources":["../../src/collections/OrderedMultiSet.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,SAAS,cAAc,CAAI,CAAI,EAAE,CAAI;IACnC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,OAAO,eAAe;IAG1B,YAAY,OAAuB;QACjC,IAAI,CAAC,KAAK,GAAG,IAAI,YAAY,CAAO;YAClC,OAAO,EAAE,OAAO,IAAI,cAAc;YAClC,kBAAkB,EAAE,IAAI;SACzB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IAC1B,CAAC;IAED,GAAG,CAAC,KAAQ;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,yCAAyC;IACzC,KAAK,CAAC,KAAQ;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,yCAAyC;IACzC,GAAG,CAAC,KAAQ;QACV,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,+DAA+D;IAC/D,MAAM,CAAC,KAAQ;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,8DAA8D;IAC9D,SAAS,CAAC,KAAQ;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,CAAC,MAAM,CAAC,QAAQ,CAAC;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,OAAO;QACL,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAChC,CAAC;CACF"}
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Ordered set (STL-style set). Unique elements sorted by comparator.
|
|
3
|
-
* Implemented with a
|
|
2
|
+
* Ordered set (STL-style set). Unique elements sorted by comparator.
|
|
3
|
+
* O(log n) has/add/delete. Implemented with a Red-Black tree.
|
|
4
4
|
*/
|
|
5
5
|
import type { Comparator } from '../types/index.js';
|
|
6
6
|
export declare class OrderedSet<T> {
|
|
7
|
-
private
|
|
8
|
-
private _compare;
|
|
7
|
+
private _tree;
|
|
9
8
|
constructor(compare?: Comparator<T>);
|
|
10
9
|
get size(): number;
|
|
11
10
|
get empty(): boolean;
|
|
12
|
-
private _lowerBound;
|
|
13
11
|
has(value: T): boolean;
|
|
14
12
|
add(value: T): void;
|
|
15
13
|
delete(value: T): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OrderedSet.d.ts","sourceRoot":"","sources":["../../src/collections/OrderedSet.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"OrderedSet.d.ts","sourceRoot":"","sources":["../../src/collections/OrderedSet.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAOpD,qBAAa,UAAU,CAAC,CAAC;IACvB,OAAO,CAAC,KAAK,CAAqB;gBAEtB,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IAOnC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO;IAItB,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAInB,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO;IAIzB,KAAK,IAAI,IAAI;IAIb,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC;IAIhC,OAAO,IAAI,CAAC,EAAE;CAGf"}
|
|
@@ -1,56 +1,37 @@
|
|
|
1
|
+
import { RedBlackTree } from './RedBlackTree.js';
|
|
1
2
|
function defaultCompare(a, b) {
|
|
2
3
|
return a < b ? -1 : a > b ? 1 : 0;
|
|
3
4
|
}
|
|
4
5
|
export class OrderedSet {
|
|
5
6
|
constructor(compare) {
|
|
6
|
-
this.
|
|
7
|
-
|
|
7
|
+
this._tree = new RedBlackTree({
|
|
8
|
+
compare: compare ?? defaultCompare,
|
|
9
|
+
allowDuplicateKeys: false,
|
|
10
|
+
});
|
|
8
11
|
}
|
|
9
12
|
get size() {
|
|
10
|
-
return this.
|
|
13
|
+
return this._tree.size;
|
|
11
14
|
}
|
|
12
15
|
get empty() {
|
|
13
|
-
return this.
|
|
14
|
-
}
|
|
15
|
-
_lowerBound(value) {
|
|
16
|
-
const cmp = this._compare;
|
|
17
|
-
let lo = 0;
|
|
18
|
-
let hi = this._data.length;
|
|
19
|
-
while (lo < hi) {
|
|
20
|
-
const mid = (lo + hi) >>> 1;
|
|
21
|
-
if (cmp(this._data[mid], value) < 0)
|
|
22
|
-
lo = mid + 1;
|
|
23
|
-
else
|
|
24
|
-
hi = mid;
|
|
25
|
-
}
|
|
26
|
-
return lo;
|
|
16
|
+
return this._tree.empty;
|
|
27
17
|
}
|
|
28
18
|
has(value) {
|
|
29
|
-
|
|
30
|
-
return i < this._data.length && this._compare(this._data[i], value) === 0;
|
|
19
|
+
return this._tree.has(value);
|
|
31
20
|
}
|
|
32
21
|
add(value) {
|
|
33
|
-
|
|
34
|
-
if (i >= this._data.length || this._compare(this._data[i], value) !== 0) {
|
|
35
|
-
this._data.splice(i, 0, value);
|
|
36
|
-
}
|
|
22
|
+
this._tree.set(value, value);
|
|
37
23
|
}
|
|
38
24
|
delete(value) {
|
|
39
|
-
|
|
40
|
-
if (i < this._data.length && this._compare(this._data[i], value) === 0) {
|
|
41
|
-
this._data.splice(i, 1);
|
|
42
|
-
return true;
|
|
43
|
-
}
|
|
44
|
-
return false;
|
|
25
|
+
return this._tree.deleteKey(value);
|
|
45
26
|
}
|
|
46
27
|
clear() {
|
|
47
|
-
this.
|
|
28
|
+
this._tree.clear();
|
|
48
29
|
}
|
|
49
30
|
[Symbol.iterator]() {
|
|
50
|
-
return this.
|
|
31
|
+
return this._tree.keys();
|
|
51
32
|
}
|
|
52
33
|
toArray() {
|
|
53
|
-
return [...this.
|
|
34
|
+
return [...this._tree.keys()];
|
|
54
35
|
}
|
|
55
36
|
}
|
|
56
37
|
//# sourceMappingURL=OrderedSet.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OrderedSet.js","sourceRoot":"","sources":["../../src/collections/OrderedSet.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"OrderedSet.js","sourceRoot":"","sources":["../../src/collections/OrderedSet.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,SAAS,cAAc,CAAI,CAAI,EAAE,CAAI;IACnC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,OAAO,UAAU;IAGrB,YAAY,OAAuB;QACjC,IAAI,CAAC,KAAK,GAAG,IAAI,YAAY,CAAO;YAClC,OAAO,EAAE,OAAO,IAAI,cAAc;YAClC,kBAAkB,EAAE,KAAK;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IAC1B,CAAC;IAED,GAAG,CAAC,KAAQ;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,GAAG,CAAC,KAAQ;QACV,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,KAAQ;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,CAAC,MAAM,CAAC,QAAQ,CAAC;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,OAAO;QACL,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAChC,CAAC;CACF"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Red-Black tree. O(log n) get/set/add/delete. Used by OrderedSet, OrderedMap, OrderedMultiSet, OrderedMultiMap.
|
|
3
|
+
*/
|
|
4
|
+
import type { Comparator } from '../types/index.js';
|
|
5
|
+
export declare class RBNode<K, V> {
|
|
6
|
+
key: K;
|
|
7
|
+
value: V;
|
|
8
|
+
left: RBNode<K, V>;
|
|
9
|
+
right: RBNode<K, V>;
|
|
10
|
+
parent: RBNode<K, V>;
|
|
11
|
+
color: 0 | 1;
|
|
12
|
+
constructor(key: K, value: V, color: 0 | 1);
|
|
13
|
+
}
|
|
14
|
+
export interface RedBlackTreeOptions<K> {
|
|
15
|
+
compare?: Comparator<K>;
|
|
16
|
+
/** If true, multiple nodes can have the same key (for MultiSet/MultiMap). */
|
|
17
|
+
allowDuplicateKeys?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare class RedBlackTree<K, V> {
|
|
20
|
+
private _nil;
|
|
21
|
+
private _root;
|
|
22
|
+
private _compare;
|
|
23
|
+
private _allowDuplicateKeys;
|
|
24
|
+
private _nodeCount;
|
|
25
|
+
constructor(options?: RedBlackTreeOptions<K>);
|
|
26
|
+
get size(): number;
|
|
27
|
+
get empty(): boolean;
|
|
28
|
+
private _cmp;
|
|
29
|
+
/** Insert position: when equal and allowDuplicateKeys, go right; else we replace (handled in set). */
|
|
30
|
+
private _insertPosition;
|
|
31
|
+
/** Find leftmost node with key >= key. */
|
|
32
|
+
lowerBound(key: K): RBNode<K, V> | null;
|
|
33
|
+
/** Find leftmost node with key > key. */
|
|
34
|
+
upperBound(key: K): RBNode<K, V> | null;
|
|
35
|
+
find(key: K): RBNode<K, V> | null;
|
|
36
|
+
has(key: K): boolean;
|
|
37
|
+
get(key: K): V | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* Set or insert. If allowDuplicateKeys is false and key exists, replaces value.
|
|
40
|
+
* Otherwise inserts. Returns the node (existing or new).
|
|
41
|
+
*/
|
|
42
|
+
set(key: K, value: V): RBNode<K, V>;
|
|
43
|
+
private _leftRotate;
|
|
44
|
+
private _rightRotate;
|
|
45
|
+
private _insertFixup;
|
|
46
|
+
/** Remove one node with key. Returns true if removed. */
|
|
47
|
+
deleteKey(key: K): boolean;
|
|
48
|
+
/** Remove all nodes with key. Returns count removed. */
|
|
49
|
+
deleteAllKeys(key: K): number;
|
|
50
|
+
/** Remove this node. */
|
|
51
|
+
deleteNode(z: RBNode<K, V>): void;
|
|
52
|
+
private _deleteNode;
|
|
53
|
+
private _transplant;
|
|
54
|
+
private _minimum;
|
|
55
|
+
private _deleteFixup;
|
|
56
|
+
/** Number of nodes with key === key (for duplicate-key trees). */
|
|
57
|
+
count(key: K): number;
|
|
58
|
+
/** Number of nodes with key in [lowerKey, upperKey). */
|
|
59
|
+
countBetween(lowerKey: K, upperKey: K): number;
|
|
60
|
+
/** In-order successor (internal use). */
|
|
61
|
+
successor(node: RBNode<K, V>): RBNode<K, V> | null;
|
|
62
|
+
/** In-order successor. */
|
|
63
|
+
private _successor;
|
|
64
|
+
/** First node in in-order (leftmost). */
|
|
65
|
+
first(): RBNode<K, V> | null;
|
|
66
|
+
clear(): void;
|
|
67
|
+
/** In-order iteration over nodes. */
|
|
68
|
+
nodes(): IterableIterator<RBNode<K, V>>;
|
|
69
|
+
/** In-order iteration over [key, value] pairs. */
|
|
70
|
+
entries(): IterableIterator<[K, V]>;
|
|
71
|
+
keys(): IterableIterator<K>;
|
|
72
|
+
values(): IterableIterator<V>;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=RedBlackTree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RedBlackTree.d.ts","sourceRoot":"","sources":["../../src/collections/RedBlackTree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
const RED = 0;
|
|
2
|
+
const BLACK = 1;
|
|
3
|
+
export class RBNode {
|
|
4
|
+
constructor(key, value, color) {
|
|
5
|
+
this.key = key;
|
|
6
|
+
this.value = value;
|
|
7
|
+
this.color = color;
|
|
8
|
+
this.left = this;
|
|
9
|
+
this.right = this;
|
|
10
|
+
this.parent = this;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class RedBlackTree {
|
|
14
|
+
constructor(options = {}) {
|
|
15
|
+
this._nodeCount = 0;
|
|
16
|
+
this._compare = options.compare ?? ((a, b) => (a < b ? -1 : a > b ? 1 : 0));
|
|
17
|
+
this._allowDuplicateKeys = options.allowDuplicateKeys ?? false;
|
|
18
|
+
this._nil = new RBNode(null, null, BLACK);
|
|
19
|
+
this._nil.left = this._nil;
|
|
20
|
+
this._nil.right = this._nil;
|
|
21
|
+
this._nil.parent = this._nil;
|
|
22
|
+
this._root = this._nil;
|
|
23
|
+
}
|
|
24
|
+
get size() {
|
|
25
|
+
return this._nodeCount;
|
|
26
|
+
}
|
|
27
|
+
get empty() {
|
|
28
|
+
return this._nodeCount === 0;
|
|
29
|
+
}
|
|
30
|
+
_cmp(a, b) {
|
|
31
|
+
return this._compare(a, b);
|
|
32
|
+
}
|
|
33
|
+
/** Insert position: when equal and allowDuplicateKeys, go right; else we replace (handled in set). */
|
|
34
|
+
_insertPosition(key) {
|
|
35
|
+
let x = this._root;
|
|
36
|
+
let p = this._nil;
|
|
37
|
+
let goRight = false;
|
|
38
|
+
while (x !== this._nil) {
|
|
39
|
+
p = x;
|
|
40
|
+
const c = this._cmp(key, x.key);
|
|
41
|
+
if (c < 0) {
|
|
42
|
+
x = x.left;
|
|
43
|
+
goRight = false;
|
|
44
|
+
}
|
|
45
|
+
else if (c > 0) {
|
|
46
|
+
x = x.right;
|
|
47
|
+
goRight = true;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
if (this._allowDuplicateKeys) {
|
|
51
|
+
x = x.right;
|
|
52
|
+
goRight = true;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
return { node: x, goRight: true };
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return { node: p, goRight };
|
|
60
|
+
}
|
|
61
|
+
/** Find leftmost node with key >= key. */
|
|
62
|
+
lowerBound(key) {
|
|
63
|
+
let x = this._root;
|
|
64
|
+
let result = null;
|
|
65
|
+
while (x !== this._nil) {
|
|
66
|
+
const c = this._cmp(x.key, key);
|
|
67
|
+
if (c >= 0) {
|
|
68
|
+
result = x;
|
|
69
|
+
x = x.left;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
x = x.right;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return result;
|
|
76
|
+
}
|
|
77
|
+
/** Find leftmost node with key > key. */
|
|
78
|
+
upperBound(key) {
|
|
79
|
+
let x = this._root;
|
|
80
|
+
let result = null;
|
|
81
|
+
while (x !== this._nil) {
|
|
82
|
+
if (this._cmp(x.key, key) > 0) {
|
|
83
|
+
result = x;
|
|
84
|
+
x = x.left;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
x = x.right;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
find(key) {
|
|
93
|
+
const node = this.lowerBound(key);
|
|
94
|
+
if (node !== null && this._cmp(node.key, key) === 0)
|
|
95
|
+
return node;
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
has(key) {
|
|
99
|
+
return this.find(key) !== null;
|
|
100
|
+
}
|
|
101
|
+
get(key) {
|
|
102
|
+
const node = this.find(key);
|
|
103
|
+
return node ? node.value : undefined;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Set or insert. If allowDuplicateKeys is false and key exists, replaces value.
|
|
107
|
+
* Otherwise inserts. Returns the node (existing or new).
|
|
108
|
+
*/
|
|
109
|
+
set(key, value) {
|
|
110
|
+
const { node: p, goRight } = this._insertPosition(key);
|
|
111
|
+
if (!this._allowDuplicateKeys && p !== this._nil && this._cmp(p.key, key) === 0) {
|
|
112
|
+
p.value = value;
|
|
113
|
+
return p;
|
|
114
|
+
}
|
|
115
|
+
const z = new RBNode(key, value, RED);
|
|
116
|
+
z.left = this._nil;
|
|
117
|
+
z.right = this._nil;
|
|
118
|
+
z.parent = p;
|
|
119
|
+
if (p === this._nil) {
|
|
120
|
+
this._root = z;
|
|
121
|
+
}
|
|
122
|
+
else if (goRight) {
|
|
123
|
+
p.right = z;
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
p.left = z;
|
|
127
|
+
}
|
|
128
|
+
this._nodeCount++;
|
|
129
|
+
this._insertFixup(z);
|
|
130
|
+
return z;
|
|
131
|
+
}
|
|
132
|
+
_leftRotate(x) {
|
|
133
|
+
const y = x.right;
|
|
134
|
+
x.right = y.left;
|
|
135
|
+
if (y.left !== this._nil)
|
|
136
|
+
y.left.parent = x;
|
|
137
|
+
y.parent = x.parent;
|
|
138
|
+
if (x.parent === this._nil) {
|
|
139
|
+
this._root = y;
|
|
140
|
+
}
|
|
141
|
+
else if (x === x.parent.left) {
|
|
142
|
+
x.parent.left = y;
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
x.parent.right = y;
|
|
146
|
+
}
|
|
147
|
+
y.left = x;
|
|
148
|
+
x.parent = y;
|
|
149
|
+
}
|
|
150
|
+
_rightRotate(y) {
|
|
151
|
+
const x = y.left;
|
|
152
|
+
y.left = x.right;
|
|
153
|
+
if (x.right !== this._nil)
|
|
154
|
+
x.right.parent = y;
|
|
155
|
+
x.parent = y.parent;
|
|
156
|
+
if (y.parent === this._nil) {
|
|
157
|
+
this._root = x;
|
|
158
|
+
}
|
|
159
|
+
else if (y === y.parent.left) {
|
|
160
|
+
y.parent.left = x;
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
y.parent.right = x;
|
|
164
|
+
}
|
|
165
|
+
x.right = y;
|
|
166
|
+
y.parent = x;
|
|
167
|
+
}
|
|
168
|
+
_insertFixup(z) {
|
|
169
|
+
while (z.parent.color === RED) {
|
|
170
|
+
if (z.parent === z.parent.parent.left) {
|
|
171
|
+
const y = z.parent.parent.right;
|
|
172
|
+
if (y.color === RED) {
|
|
173
|
+
z.parent.color = BLACK;
|
|
174
|
+
y.color = BLACK;
|
|
175
|
+
z.parent.parent.color = RED;
|
|
176
|
+
z = z.parent.parent;
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
if (z === z.parent.right) {
|
|
180
|
+
z = z.parent;
|
|
181
|
+
this._leftRotate(z);
|
|
182
|
+
}
|
|
183
|
+
z.parent.color = BLACK;
|
|
184
|
+
z.parent.parent.color = RED;
|
|
185
|
+
this._rightRotate(z.parent.parent);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
const y = z.parent.parent.left;
|
|
190
|
+
if (y.color === RED) {
|
|
191
|
+
z.parent.color = BLACK;
|
|
192
|
+
y.color = BLACK;
|
|
193
|
+
z.parent.parent.color = RED;
|
|
194
|
+
z = z.parent.parent;
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
if (z === z.parent.left) {
|
|
198
|
+
z = z.parent;
|
|
199
|
+
this._rightRotate(z);
|
|
200
|
+
}
|
|
201
|
+
z.parent.color = BLACK;
|
|
202
|
+
z.parent.parent.color = RED;
|
|
203
|
+
this._leftRotate(z.parent.parent);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
this._root.color = BLACK;
|
|
208
|
+
}
|
|
209
|
+
/** Remove one node with key. Returns true if removed. */
|
|
210
|
+
deleteKey(key) {
|
|
211
|
+
const z = this.find(key);
|
|
212
|
+
if (z === null)
|
|
213
|
+
return false;
|
|
214
|
+
this._deleteNode(z);
|
|
215
|
+
return true;
|
|
216
|
+
}
|
|
217
|
+
/** Remove all nodes with key. Returns count removed. */
|
|
218
|
+
deleteAllKeys(key) {
|
|
219
|
+
let n = 0;
|
|
220
|
+
while (this.deleteKey(key))
|
|
221
|
+
n++;
|
|
222
|
+
return n;
|
|
223
|
+
}
|
|
224
|
+
/** Remove this node. */
|
|
225
|
+
deleteNode(z) {
|
|
226
|
+
if (z === this._nil)
|
|
227
|
+
return;
|
|
228
|
+
this._deleteNode(z);
|
|
229
|
+
}
|
|
230
|
+
_deleteNode(z) {
|
|
231
|
+
let y = z;
|
|
232
|
+
let yOriginalColor = y.color;
|
|
233
|
+
let x;
|
|
234
|
+
if (z.left === this._nil) {
|
|
235
|
+
x = z.right;
|
|
236
|
+
this._transplant(z, z.right);
|
|
237
|
+
}
|
|
238
|
+
else if (z.right === this._nil) {
|
|
239
|
+
x = z.left;
|
|
240
|
+
this._transplant(z, z.left);
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
y = this._minimum(z.right);
|
|
244
|
+
yOriginalColor = y.color;
|
|
245
|
+
x = y.right;
|
|
246
|
+
if (y.parent === z) {
|
|
247
|
+
if (x !== this._nil)
|
|
248
|
+
x.parent = y;
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
this._transplant(y, y.right);
|
|
252
|
+
y.right = z.right;
|
|
253
|
+
y.right.parent = y;
|
|
254
|
+
}
|
|
255
|
+
this._transplant(z, y);
|
|
256
|
+
y.left = z.left;
|
|
257
|
+
y.left.parent = y;
|
|
258
|
+
y.color = z.color;
|
|
259
|
+
}
|
|
260
|
+
if (yOriginalColor === BLACK) {
|
|
261
|
+
this._deleteFixup(x);
|
|
262
|
+
}
|
|
263
|
+
this._nodeCount--;
|
|
264
|
+
}
|
|
265
|
+
_transplant(u, v) {
|
|
266
|
+
if (u.parent === this._nil) {
|
|
267
|
+
this._root = v;
|
|
268
|
+
}
|
|
269
|
+
else if (u === u.parent.left) {
|
|
270
|
+
u.parent.left = v;
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
u.parent.right = v;
|
|
274
|
+
}
|
|
275
|
+
v.parent = u.parent;
|
|
276
|
+
}
|
|
277
|
+
_minimum(x) {
|
|
278
|
+
while (x.left !== this._nil)
|
|
279
|
+
x = x.left;
|
|
280
|
+
return x;
|
|
281
|
+
}
|
|
282
|
+
_deleteFixup(x) {
|
|
283
|
+
while (x !== this._root && x.color === BLACK) {
|
|
284
|
+
if (x === x.parent.left) {
|
|
285
|
+
let w = x.parent.right;
|
|
286
|
+
if (w.color === RED) {
|
|
287
|
+
w.color = BLACK;
|
|
288
|
+
x.parent.color = RED;
|
|
289
|
+
this._leftRotate(x.parent);
|
|
290
|
+
w = x.parent.right;
|
|
291
|
+
}
|
|
292
|
+
if (w.left.color === BLACK && w.right.color === BLACK) {
|
|
293
|
+
w.color = RED;
|
|
294
|
+
x = x.parent;
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
if (w.right.color === BLACK) {
|
|
298
|
+
w.left.color = BLACK;
|
|
299
|
+
w.color = RED;
|
|
300
|
+
this._rightRotate(w);
|
|
301
|
+
w = x.parent.right;
|
|
302
|
+
}
|
|
303
|
+
w.color = x.parent.color;
|
|
304
|
+
x.parent.color = BLACK;
|
|
305
|
+
w.right.color = BLACK;
|
|
306
|
+
this._leftRotate(x.parent);
|
|
307
|
+
x = this._root;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
let w = x.parent.left;
|
|
312
|
+
if (w.color === RED) {
|
|
313
|
+
w.color = BLACK;
|
|
314
|
+
x.parent.color = RED;
|
|
315
|
+
this._rightRotate(x.parent);
|
|
316
|
+
w = x.parent.left;
|
|
317
|
+
}
|
|
318
|
+
if (w.right.color === BLACK && w.left.color === BLACK) {
|
|
319
|
+
w.color = RED;
|
|
320
|
+
x = x.parent;
|
|
321
|
+
}
|
|
322
|
+
else {
|
|
323
|
+
if (w.left.color === BLACK) {
|
|
324
|
+
w.right.color = BLACK;
|
|
325
|
+
w.color = RED;
|
|
326
|
+
this._leftRotate(w);
|
|
327
|
+
w = x.parent.left;
|
|
328
|
+
}
|
|
329
|
+
w.color = x.parent.color;
|
|
330
|
+
x.parent.color = BLACK;
|
|
331
|
+
w.left.color = BLACK;
|
|
332
|
+
this._rightRotate(x.parent);
|
|
333
|
+
x = this._root;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
x.color = BLACK;
|
|
338
|
+
}
|
|
339
|
+
/** Number of nodes with key === key (for duplicate-key trees). */
|
|
340
|
+
count(key) {
|
|
341
|
+
let x = this.lowerBound(key);
|
|
342
|
+
let n = 0;
|
|
343
|
+
while (x !== null && this._cmp(x.key, key) === 0) {
|
|
344
|
+
n++;
|
|
345
|
+
x = this._successor(x);
|
|
346
|
+
}
|
|
347
|
+
return n;
|
|
348
|
+
}
|
|
349
|
+
/** Number of nodes with key in [lowerKey, upperKey). */
|
|
350
|
+
countBetween(lowerKey, upperKey) {
|
|
351
|
+
let lo = this.lowerBound(lowerKey);
|
|
352
|
+
const hi = this.upperBound(upperKey);
|
|
353
|
+
let n = 0;
|
|
354
|
+
while (lo !== null && (hi === null || lo !== hi) && this._cmp(lo.key, upperKey) < 0) {
|
|
355
|
+
n++;
|
|
356
|
+
lo = this._successor(lo);
|
|
357
|
+
}
|
|
358
|
+
return n;
|
|
359
|
+
}
|
|
360
|
+
/** In-order successor (internal use). */
|
|
361
|
+
successor(node) {
|
|
362
|
+
return this._successor(node);
|
|
363
|
+
}
|
|
364
|
+
/** In-order successor. */
|
|
365
|
+
_successor(x) {
|
|
366
|
+
if (x.right !== this._nil) {
|
|
367
|
+
let s = x.right;
|
|
368
|
+
while (s.left !== this._nil)
|
|
369
|
+
s = s.left;
|
|
370
|
+
return s;
|
|
371
|
+
}
|
|
372
|
+
let p = x.parent;
|
|
373
|
+
while (p !== this._nil && x === p.right) {
|
|
374
|
+
x = p;
|
|
375
|
+
p = p.parent;
|
|
376
|
+
}
|
|
377
|
+
return p === this._nil ? null : p;
|
|
378
|
+
}
|
|
379
|
+
/** First node in in-order (leftmost). */
|
|
380
|
+
first() {
|
|
381
|
+
if (this._root === this._nil)
|
|
382
|
+
return null;
|
|
383
|
+
let x = this._root;
|
|
384
|
+
while (x.left !== this._nil)
|
|
385
|
+
x = x.left;
|
|
386
|
+
return x;
|
|
387
|
+
}
|
|
388
|
+
clear() {
|
|
389
|
+
this._root = this._nil;
|
|
390
|
+
this._nodeCount = 0;
|
|
391
|
+
}
|
|
392
|
+
/** In-order iteration over nodes. */
|
|
393
|
+
*nodes() {
|
|
394
|
+
let x = this.first();
|
|
395
|
+
while (x !== null) {
|
|
396
|
+
yield x;
|
|
397
|
+
x = this._successor(x);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
/** In-order iteration over [key, value] pairs. */
|
|
401
|
+
*entries() {
|
|
402
|
+
for (const node of this.nodes())
|
|
403
|
+
yield [node.key, node.value];
|
|
404
|
+
}
|
|
405
|
+
*keys() {
|
|
406
|
+
for (const node of this.nodes())
|
|
407
|
+
yield node.key;
|
|
408
|
+
}
|
|
409
|
+
*values() {
|
|
410
|
+
for (const node of this.nodes())
|
|
411
|
+
yield node.value;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
//# sourceMappingURL=RedBlackTree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RedBlackTree.js","sourceRoot":"","sources":["../../src/collections/RedBlackTree.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,4 +7,7 @@ export { OrderedMap } from './OrderedMap.js';
|
|
|
7
7
|
export { UnorderedMap } from './UnorderedMap.js';
|
|
8
8
|
export { OrderedSet } from './OrderedSet.js';
|
|
9
9
|
export { UnorderedSet } from './UnorderedSet.js';
|
|
10
|
+
export { OrderedMultiSet } from './OrderedMultiSet.js';
|
|
11
|
+
export { OrderedMultiMap } from './OrderedMultiMap.js';
|
|
12
|
+
export { RedBlackTree, RBNode } from './RedBlackTree.js';
|
|
10
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/collections/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/collections/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -7,4 +7,7 @@ export { OrderedMap } from './OrderedMap.js';
|
|
|
7
7
|
export { UnorderedMap } from './UnorderedMap.js';
|
|
8
8
|
export { OrderedSet } from './OrderedSet.js';
|
|
9
9
|
export { UnorderedSet } from './UnorderedSet.js';
|
|
10
|
+
export { OrderedMultiSet } from './OrderedMultiSet.js';
|
|
11
|
+
export { OrderedMultiMap } from './OrderedMultiMap.js';
|
|
12
|
+
export { RedBlackTree, RBNode } from './RedBlackTree.js';
|
|
10
13
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/collections/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/collections/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* @example
|
|
6
6
|
* import { Vector, Stack, Queue, List, sort, binarySearch, clamp } from 'typescript-dsa-stl';
|
|
7
7
|
*/
|
|
8
|
-
export { Vector, Stack, Queue, List, ListNode, PriorityQueue, OrderedMap, UnorderedMap, OrderedSet, UnorderedSet, } from './collections/index.js';
|
|
8
|
+
export { Vector, Stack, Queue, List, ListNode, PriorityQueue, OrderedMap, UnorderedMap, OrderedSet, UnorderedSet, OrderedMultiSet, OrderedMultiMap, } from './collections/index.js';
|
|
9
9
|
export { sort, find, findIndex, transform, filter, reduce, reverse, unique, binarySearch, lowerBound, upperBound, min, max, partition, } from './algorithms/index.js';
|
|
10
10
|
export { clamp, range, noop, identity, swap } from './utils/index.js';
|
|
11
11
|
export type { Comparator, Predicate, UnaryFn, Reducer, IterableLike } from './types/index.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,MAAM,EACN,KAAK,EACL,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,UAAU,EACV,YAAY,EACZ,UAAU,EACV,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,MAAM,EACN,KAAK,EACL,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,UAAU,EACV,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,eAAe,EACf,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,SAAS,EACT,MAAM,EACN,MAAM,EACN,OAAO,EACP,MAAM,EACN,YAAY,EACZ,UAAU,EACV,UAAU,EACV,GAAG,EACH,GAAG,EACH,SAAS,GACV,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACtE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC9F,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* @example
|
|
6
6
|
* import { Vector, Stack, Queue, List, sort, binarySearch, clamp } from 'typescript-dsa-stl';
|
|
7
7
|
*/
|
|
8
|
-
export { Vector, Stack, Queue, List, ListNode, PriorityQueue, OrderedMap, UnorderedMap, OrderedSet, UnorderedSet, } from './collections/index.js';
|
|
8
|
+
export { Vector, Stack, Queue, List, ListNode, PriorityQueue, OrderedMap, UnorderedMap, OrderedSet, UnorderedSet, OrderedMultiSet, OrderedMultiMap, } from './collections/index.js';
|
|
9
9
|
export { sort, find, findIndex, transform, filter, reduce, reverse, unique, binarySearch, lowerBound, upperBound, min, max, partition, } from './algorithms/index.js';
|
|
10
10
|
export { clamp, range, noop, identity, swap } from './utils/index.js';
|
|
11
11
|
export { toArray } from './types/index.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,MAAM,EACN,KAAK,EACL,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,UAAU,EACV,YAAY,EACZ,UAAU,EACV,YAAY,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,MAAM,EACN,KAAK,EACL,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,UAAU,EACV,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,eAAe,EACf,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,SAAS,EACT,MAAM,EACN,MAAM,EACN,OAAO,EACP,MAAM,EACN,YAAY,EACZ,UAAU,EACV,UAAU,EACV,GAAG,EACH,GAAG,EACH,SAAS,GACV,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAEtE,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "typescript-dsa-stl",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "STL-style data structures and algorithms for TypeScript: Vector, Stack, Queue, List, PriorityQueue, Map, Set, sort, binarySearch. Use like C++ STL.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -58,6 +58,10 @@
|
|
|
58
58
|
"set",
|
|
59
59
|
"ordered-map",
|
|
60
60
|
"unordered-map",
|
|
61
|
+
"ordered-multimap",
|
|
62
|
+
"ordered-multiset",
|
|
63
|
+
"multimap",
|
|
64
|
+
"multiset",
|
|
61
65
|
"binary-search",
|
|
62
66
|
"collections",
|
|
63
67
|
"sdk"
|