typescript-dsa-stl 1.2.2 → 1.3.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 +109 -2
- package/dist/collections/OrderedMultiMap.d.ts +35 -0
- package/dist/collections/OrderedMultiMap.d.ts.map +1 -0
- package/dist/collections/OrderedMultiMap.js +121 -0
- package/dist/collections/OrderedMultiMap.js.map +1 -0
- package/dist/collections/OrderedMultiSet.d.ts +27 -0
- package/dist/collections/OrderedMultiSet.d.ts.map +1 -0
- package/dist/collections/OrderedMultiSet.js +82 -0
- package/dist/collections/OrderedMultiSet.js.map +1 -0
- package/dist/collections/index.d.ts +2 -0
- package/dist/collections/index.d.ts.map +1 -1
- package/dist/collections/index.js +2 -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]
|
|
@@ -89,13 +102,55 @@ clamp(42, 0, 10); // 10
|
|
|
89
102
|
range(0, 5); // [0, 1, 2, 3, 4]
|
|
90
103
|
```
|
|
91
104
|
|
|
105
|
+
### 2D and 3D vectors (like C++ `vector<vector<int>>`)
|
|
106
|
+
|
|
107
|
+
`Vector<T>` is generic, so you can nest it for 2D/3D grids:
|
|
108
|
+
|
|
109
|
+
| C++ | TypeScript |
|
|
110
|
+
|-----|------------|
|
|
111
|
+
| `vector<int>` | `Vector<number>` |
|
|
112
|
+
| `vector<vector<int>>` | `Vector<Vector<number>>` |
|
|
113
|
+
| `vector<vector<vector<int>>>` | `Vector<Vector<Vector<number>>>` |
|
|
114
|
+
|
|
115
|
+
**2D example:**
|
|
116
|
+
|
|
117
|
+
```ts
|
|
118
|
+
import { Vector } from 'typescript-dsa-stl';
|
|
119
|
+
|
|
120
|
+
const grid = new Vector<Vector<number>>();
|
|
121
|
+
|
|
122
|
+
const row0 = new Vector<number>([1, 2, 3]);
|
|
123
|
+
const row1 = new Vector<number>([4, 5, 6]);
|
|
124
|
+
grid.push(row0);
|
|
125
|
+
grid.push(row1);
|
|
126
|
+
|
|
127
|
+
grid.at(0).at(1); // 2 (first row, second column)
|
|
128
|
+
grid.at(1).at(0); // 4 (second row, first column)
|
|
129
|
+
|
|
130
|
+
grid.at(0).set(1, 99);
|
|
131
|
+
grid.at(0).push(10);
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**3D example:**
|
|
135
|
+
|
|
136
|
+
```ts
|
|
137
|
+
const cube = new Vector<Vector<Vector<number>>>();
|
|
138
|
+
|
|
139
|
+
const layer0 = new Vector<Vector<number>>();
|
|
140
|
+
layer0.push(new Vector<number>([1, 2]));
|
|
141
|
+
layer0.push(new Vector<number>([3, 4]));
|
|
142
|
+
cube.push(layer0);
|
|
143
|
+
|
|
144
|
+
cube.at(0).at(1).at(0); // 3 (layer 0, row 1, col 0)
|
|
145
|
+
```
|
|
146
|
+
|
|
92
147
|
---
|
|
93
148
|
|
|
94
149
|
## API overview
|
|
95
150
|
|
|
96
151
|
| Module | Exports |
|
|
97
152
|
|--------|--------|
|
|
98
|
-
| **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` |
|
|
99
154
|
| **Algorithms** | `sort`, `find`, `findIndex`, `transform`, `filter`, `reduce`, `reverse`, `unique`, `binarySearch`, `lowerBound`, `upperBound`, `min`, `max`, `partition` |
|
|
100
155
|
| **Utils** | `clamp`, `range`, `noop`, `identity`, `swap` |
|
|
101
156
|
| **Types** | `Comparator`, `Predicate`, `UnaryFn`, `Reducer`, `IterableLike`, `toArray` |
|
|
@@ -124,12 +179,64 @@ import type { Comparator } from 'typescript-dsa-stl/types';
|
|
|
124
179
|
| **UnorderedMap** | O(1)* get/set | O(1)* | — | O(1)* delete | — |
|
|
125
180
|
| **OrderedSet** (Set) | O(log n) has | O(n) add | — | O(n) delete | — |
|
|
126
181
|
| **UnorderedSet** | O(1)* has/add | O(1)* | — | O(1)* delete | — |
|
|
182
|
+
| **OrderedMultiMap** | O(log n) get | O(n) set | — | O(n) delete | — |
|
|
183
|
+
| **OrderedMultiSet** | O(log n) has/count | O(n) add | — | O(n) delete | — |
|
|
127
184
|
|
|
128
185
|
\* Amortized (hash).
|
|
129
186
|
\** At a known node.
|
|
130
187
|
|
|
131
188
|
---
|
|
132
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
|
+
|
|
133
240
|
## For maintainers
|
|
134
241
|
|
|
135
242
|
- **Build:** `npm run build` (also runs before `npm publish` via `prepublishOnly`)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ordered multimap (STL-style multimap). Keys sorted by comparator; one key can have multiple values.
|
|
3
|
+
* O(log n) get/has, O(n) set/delete. Implemented with a sorted array of [key, value] pairs.
|
|
4
|
+
*/
|
|
5
|
+
import type { Comparator } from '../types/index.js';
|
|
6
|
+
export declare class OrderedMultiMap<K, V> {
|
|
7
|
+
private _entries;
|
|
8
|
+
private _compare;
|
|
9
|
+
constructor(compare?: Comparator<K>);
|
|
10
|
+
get size(): number;
|
|
11
|
+
get empty(): boolean;
|
|
12
|
+
private _lowerBound;
|
|
13
|
+
private _upperBound;
|
|
14
|
+
/** First value for key, or undefined. */
|
|
15
|
+
get(key: K): V | undefined;
|
|
16
|
+
/** All values for key (in order). */
|
|
17
|
+
getAll(key: K): V[];
|
|
18
|
+
/** Add a key-value pair (duplicate keys allowed). */
|
|
19
|
+
set(key: K, value: V): void;
|
|
20
|
+
has(key: K): boolean;
|
|
21
|
+
/** True if the pair (key, value) exists. */
|
|
22
|
+
hasEntry(key: K, value: V): boolean;
|
|
23
|
+
/** Number of pairs with this key. */
|
|
24
|
+
count(key: K): number;
|
|
25
|
+
/** Remove one pair for key (first). If value is given, remove that pair. Returns true if removed. */
|
|
26
|
+
delete(key: K, value?: V): boolean;
|
|
27
|
+
/** Remove all pairs for key. Returns count removed. */
|
|
28
|
+
deleteAll(key: K): number;
|
|
29
|
+
clear(): void;
|
|
30
|
+
keys(): Iterable<K>;
|
|
31
|
+
values(): Iterable<V>;
|
|
32
|
+
entries(): Iterable<[K, V]>;
|
|
33
|
+
[Symbol.iterator](): Iterator<[K, V]>;
|
|
34
|
+
}
|
|
35
|
+
//# 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;AAMpD,qBAAa,eAAe,CAAC,CAAC,EAAE,CAAC;IAC/B,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,QAAQ,CAAgB;gBAEpB,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IAInC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,WAAW;IAYnB,yCAAyC;IACzC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAQ1B,qCAAqC;IACrC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE;IAMnB,qDAAqD;IACrD,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAK3B,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAKpB,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;IAiBlC,uDAAuD;IACvD,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM;IAQzB,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,121 @@
|
|
|
1
|
+
function defaultCompare(a, b) {
|
|
2
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
3
|
+
}
|
|
4
|
+
export class OrderedMultiMap {
|
|
5
|
+
constructor(compare) {
|
|
6
|
+
this._entries = [];
|
|
7
|
+
this._compare = compare ?? defaultCompare;
|
|
8
|
+
}
|
|
9
|
+
get size() {
|
|
10
|
+
return this._entries.length;
|
|
11
|
+
}
|
|
12
|
+
get empty() {
|
|
13
|
+
return this._entries.length === 0;
|
|
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;
|
|
27
|
+
}
|
|
28
|
+
_upperBound(key) {
|
|
29
|
+
const cmp = this._compare;
|
|
30
|
+
let lo = 0;
|
|
31
|
+
let hi = this._entries.length;
|
|
32
|
+
while (lo < hi) {
|
|
33
|
+
const mid = (lo + hi) >>> 1;
|
|
34
|
+
if (cmp(key, this._entries[mid][0]) < 0)
|
|
35
|
+
hi = mid;
|
|
36
|
+
else
|
|
37
|
+
lo = mid + 1;
|
|
38
|
+
}
|
|
39
|
+
return lo;
|
|
40
|
+
}
|
|
41
|
+
/** First value for key, or undefined. */
|
|
42
|
+
get(key) {
|
|
43
|
+
const i = this._lowerBound(key);
|
|
44
|
+
if (i < this._entries.length && this._compare(this._entries[i][0], key) === 0) {
|
|
45
|
+
return this._entries[i][1];
|
|
46
|
+
}
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
/** All values for key (in order). */
|
|
50
|
+
getAll(key) {
|
|
51
|
+
const lo = this._lowerBound(key);
|
|
52
|
+
const hi = this._upperBound(key);
|
|
53
|
+
return this._entries.slice(lo, hi).map((e) => e[1]);
|
|
54
|
+
}
|
|
55
|
+
/** Add a key-value pair (duplicate keys allowed). */
|
|
56
|
+
set(key, value) {
|
|
57
|
+
const i = this._lowerBound(key);
|
|
58
|
+
this._entries.splice(i, 0, [key, value]);
|
|
59
|
+
}
|
|
60
|
+
has(key) {
|
|
61
|
+
const i = this._lowerBound(key);
|
|
62
|
+
return i < this._entries.length && this._compare(this._entries[i][0], key) === 0;
|
|
63
|
+
}
|
|
64
|
+
/** True if the pair (key, value) exists. */
|
|
65
|
+
hasEntry(key, value) {
|
|
66
|
+
const lo = this._lowerBound(key);
|
|
67
|
+
const hi = this._upperBound(key);
|
|
68
|
+
for (let j = lo; j < hi; j++) {
|
|
69
|
+
if (this._entries[j][1] === value)
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
/** Number of pairs with this key. */
|
|
75
|
+
count(key) {
|
|
76
|
+
return this._upperBound(key) - this._lowerBound(key);
|
|
77
|
+
}
|
|
78
|
+
/** Remove one pair for key (first). If value is given, remove that pair. Returns true if removed. */
|
|
79
|
+
delete(key, value) {
|
|
80
|
+
const lo = this._lowerBound(key);
|
|
81
|
+
const hi = this._upperBound(key);
|
|
82
|
+
if (lo >= hi)
|
|
83
|
+
return false;
|
|
84
|
+
if (value !== undefined) {
|
|
85
|
+
for (let j = lo; j < hi; j++) {
|
|
86
|
+
if (this._entries[j][1] === value) {
|
|
87
|
+
this._entries.splice(j, 1);
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
this._entries.splice(lo, 1);
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
/** Remove all pairs for key. Returns count removed. */
|
|
97
|
+
deleteAll(key) {
|
|
98
|
+
const lo = this._lowerBound(key);
|
|
99
|
+
const hi = this._upperBound(key);
|
|
100
|
+
const removed = hi - lo;
|
|
101
|
+
if (removed > 0)
|
|
102
|
+
this._entries.splice(lo, removed);
|
|
103
|
+
return removed;
|
|
104
|
+
}
|
|
105
|
+
clear() {
|
|
106
|
+
this._entries.length = 0;
|
|
107
|
+
}
|
|
108
|
+
keys() {
|
|
109
|
+
return this._entries.map((e) => e[0]);
|
|
110
|
+
}
|
|
111
|
+
values() {
|
|
112
|
+
return this._entries.map((e) => e[1]);
|
|
113
|
+
}
|
|
114
|
+
entries() {
|
|
115
|
+
return this._entries;
|
|
116
|
+
}
|
|
117
|
+
[Symbol.iterator]() {
|
|
118
|
+
return this._entries[Symbol.iterator]();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# 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,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ordered multiset (STL-style multiset). Elements sorted by comparator; duplicates allowed.
|
|
3
|
+
* O(log n) has/count, O(n) add/delete. Implemented with a sorted array and binary search.
|
|
4
|
+
*/
|
|
5
|
+
import type { Comparator } from '../types/index.js';
|
|
6
|
+
export declare class OrderedMultiSet<T> {
|
|
7
|
+
private _data;
|
|
8
|
+
private _compare;
|
|
9
|
+
constructor(compare?: Comparator<T>);
|
|
10
|
+
get size(): number;
|
|
11
|
+
get empty(): boolean;
|
|
12
|
+
private _lowerBound;
|
|
13
|
+
private _upperBound;
|
|
14
|
+
has(value: T): boolean;
|
|
15
|
+
/** Number of elements equal to value. */
|
|
16
|
+
count(value: T): number;
|
|
17
|
+
/** Insert value (duplicates allowed). */
|
|
18
|
+
add(value: T): void;
|
|
19
|
+
/** Remove one occurrence of value. Returns true if removed. */
|
|
20
|
+
delete(value: T): boolean;
|
|
21
|
+
/** Remove all occurrences of value. Returns count removed. */
|
|
22
|
+
deleteAll(value: T): number;
|
|
23
|
+
clear(): void;
|
|
24
|
+
[Symbol.iterator](): Iterator<T>;
|
|
25
|
+
toArray(): T[];
|
|
26
|
+
}
|
|
27
|
+
//# 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;AAMpD,qBAAa,eAAe,CAAC,CAAC;IAC5B,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,QAAQ,CAAgB;gBAEpB,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IAInC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,WAAW;IAYnB,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO;IAKtB,yCAAyC;IACzC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM;IAIvB,yCAAyC;IACzC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAKnB,+DAA+D;IAC/D,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO;IASzB,8DAA8D;IAC9D,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM;IAQ3B,KAAK,IAAI,IAAI;IAIb,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC;IAIhC,OAAO,IAAI,CAAC,EAAE;CAGf"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
function defaultCompare(a, b) {
|
|
2
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
3
|
+
}
|
|
4
|
+
export class OrderedMultiSet {
|
|
5
|
+
constructor(compare) {
|
|
6
|
+
this._data = [];
|
|
7
|
+
this._compare = compare ?? defaultCompare;
|
|
8
|
+
}
|
|
9
|
+
get size() {
|
|
10
|
+
return this._data.length;
|
|
11
|
+
}
|
|
12
|
+
get empty() {
|
|
13
|
+
return this._data.length === 0;
|
|
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;
|
|
27
|
+
}
|
|
28
|
+
_upperBound(value) {
|
|
29
|
+
const cmp = this._compare;
|
|
30
|
+
let lo = 0;
|
|
31
|
+
let hi = this._data.length;
|
|
32
|
+
while (lo < hi) {
|
|
33
|
+
const mid = (lo + hi) >>> 1;
|
|
34
|
+
if (cmp(value, this._data[mid]) < 0)
|
|
35
|
+
hi = mid;
|
|
36
|
+
else
|
|
37
|
+
lo = mid + 1;
|
|
38
|
+
}
|
|
39
|
+
return lo;
|
|
40
|
+
}
|
|
41
|
+
has(value) {
|
|
42
|
+
const i = this._lowerBound(value);
|
|
43
|
+
return i < this._data.length && this._compare(this._data[i], value) === 0;
|
|
44
|
+
}
|
|
45
|
+
/** Number of elements equal to value. */
|
|
46
|
+
count(value) {
|
|
47
|
+
return this._upperBound(value) - this._lowerBound(value);
|
|
48
|
+
}
|
|
49
|
+
/** Insert value (duplicates allowed). */
|
|
50
|
+
add(value) {
|
|
51
|
+
const i = this._lowerBound(value);
|
|
52
|
+
this._data.splice(i, 0, value);
|
|
53
|
+
}
|
|
54
|
+
/** Remove one occurrence of value. Returns true if removed. */
|
|
55
|
+
delete(value) {
|
|
56
|
+
const i = this._lowerBound(value);
|
|
57
|
+
if (i < this._data.length && this._compare(this._data[i], value) === 0) {
|
|
58
|
+
this._data.splice(i, 1);
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
/** Remove all occurrences of value. Returns count removed. */
|
|
64
|
+
deleteAll(value) {
|
|
65
|
+
const lo = this._lowerBound(value);
|
|
66
|
+
const hi = this._upperBound(value);
|
|
67
|
+
const removed = hi - lo;
|
|
68
|
+
if (removed > 0)
|
|
69
|
+
this._data.splice(lo, removed);
|
|
70
|
+
return removed;
|
|
71
|
+
}
|
|
72
|
+
clear() {
|
|
73
|
+
this._data.length = 0;
|
|
74
|
+
}
|
|
75
|
+
[Symbol.iterator]() {
|
|
76
|
+
return this._data[Symbol.iterator]();
|
|
77
|
+
}
|
|
78
|
+
toArray() {
|
|
79
|
+
return [...this._data];
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=OrderedMultiSet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrderedMultiSet.js","sourceRoot":"","sources":["../../src/collections/OrderedMultiSet.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,4 +7,6 @@ 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';
|
|
10
12
|
//# 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"}
|
|
@@ -7,4 +7,6 @@ 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';
|
|
10
12
|
//# 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"}
|
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.3.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"
|