directed-graph-typed 1.46.3 → 1.46.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/data-structures/hash/hash-map.d.ts +22 -26
- package/dist/data-structures/hash/hash-map.js +104 -76
- package/dist/data-structures/hash/index.d.ts +0 -4
- package/dist/data-structures/hash/index.js +0 -4
- package/dist/types/data-structures/hash/hash-map.d.ts +5 -0
- package/dist/types/data-structures/hash/index.d.ts +0 -4
- package/dist/types/data-structures/hash/index.js +0 -4
- package/dist/utils/utils.d.ts +1 -1
- package/dist/utils/utils.js +3 -3
- package/package.json +2 -2
- package/src/data-structures/hash/hash-map.ts +130 -81
- package/src/data-structures/hash/index.ts +0 -4
- package/src/types/data-structures/hash/hash-map.ts +6 -0
- package/src/types/data-structures/hash/index.ts +0 -4
- package/src/utils/utils.ts +1 -1
- package/dist/data-structures/hash/coordinate-map.d.ts +0 -44
- package/dist/data-structures/hash/coordinate-map.js +0 -62
- package/dist/data-structures/hash/coordinate-set.d.ts +0 -36
- package/dist/data-structures/hash/coordinate-set.js +0 -52
- package/dist/data-structures/hash/tree-map.d.ts +0 -2
- package/dist/data-structures/hash/tree-map.js +0 -6
- package/dist/data-structures/hash/tree-set.d.ts +0 -2
- package/dist/data-structures/hash/tree-set.js +0 -6
- package/dist/types/data-structures/hash/coordinate-map.d.ts +0 -1
- package/dist/types/data-structures/hash/coordinate-map.js +0 -2
- package/dist/types/data-structures/hash/coordinate-set.d.ts +0 -1
- package/dist/types/data-structures/hash/coordinate-set.js +0 -2
- package/dist/types/data-structures/hash/tree-map.d.ts +0 -1
- package/dist/types/data-structures/hash/tree-map.js +0 -2
- package/dist/types/data-structures/hash/tree-set.d.ts +0 -1
- package/dist/types/data-structures/hash/tree-set.js +0 -2
- package/src/data-structures/hash/coordinate-map.ts +0 -63
- package/src/data-structures/hash/coordinate-set.ts +0 -52
- package/src/data-structures/hash/tree-map.ts +0 -2
- package/src/data-structures/hash/tree-set.ts +0 -2
- package/src/types/data-structures/hash/coordinate-map.ts +0 -1
- package/src/types/data-structures/hash/coordinate-set.ts +0 -1
- package/src/types/data-structures/hash/tree-map.ts +0 -1
- package/src/types/data-structures/hash/tree-set.ts +0 -1
|
@@ -5,21 +5,21 @@
|
|
|
5
5
|
* @copyright Copyright (c) 2022 Tyler Zeng <zrwusa@gmail.com>
|
|
6
6
|
* @license MIT License
|
|
7
7
|
*/
|
|
8
|
-
import { HashMapLinkedNode,
|
|
8
|
+
import { HashMapLinkedNode, HashMapOptions } from '../../types';
|
|
9
9
|
export declare class HashMap<K = any, V = any> {
|
|
10
|
-
|
|
11
|
-
protected
|
|
12
|
-
protected
|
|
13
|
-
protected
|
|
14
|
-
protected
|
|
15
|
-
protected
|
|
10
|
+
protected _noObjMap: Record<string, HashMapLinkedNode<K, V | undefined>>;
|
|
11
|
+
protected _objMap: WeakMap<object, HashMapLinkedNode<K, V | undefined>>;
|
|
12
|
+
protected _head: HashMapLinkedNode<K, V | undefined>;
|
|
13
|
+
protected _tail: HashMapLinkedNode<K, V | undefined>;
|
|
14
|
+
protected readonly _sentinel: HashMapLinkedNode<K, V | undefined>;
|
|
15
|
+
protected _hashFn: (key: K) => string;
|
|
16
|
+
protected _objHashFn: (key: K) => object;
|
|
16
17
|
/**
|
|
17
|
-
* The constructor initializes a
|
|
18
|
-
* @param
|
|
19
|
-
*
|
|
20
|
-
* `K` represents the type of the key and `V` represents the
|
|
18
|
+
* The constructor initializes a HashMapLinkedNode with an optional iterable of key-value pairs.
|
|
19
|
+
* @param options - The `options` parameter is an object that contains the `elements` property. The
|
|
20
|
+
* `elements` property is an iterable that contains key-value pairs represented as arrays `[K, V]`.
|
|
21
21
|
*/
|
|
22
|
-
constructor(
|
|
22
|
+
constructor(options?: HashMapOptions<K, V>);
|
|
23
23
|
protected _size: number;
|
|
24
24
|
get size(): number;
|
|
25
25
|
/**
|
|
@@ -43,12 +43,12 @@ export declare class HashMap<K = any, V = any> {
|
|
|
43
43
|
/**
|
|
44
44
|
* The `begin()` function in TypeScript iterates over a linked list and yields key-value pairs.
|
|
45
45
|
*/
|
|
46
|
-
begin(): Generator<(K | V)[], void, unknown>;
|
|
46
|
+
begin(): Generator<(K | V | undefined)[], void, unknown>;
|
|
47
47
|
/**
|
|
48
48
|
* The function `reverseBegin()` iterates over a linked list in reverse order, yielding each node's
|
|
49
49
|
* key and value.
|
|
50
50
|
*/
|
|
51
|
-
reverseBegin(): Generator<(K | V)[], void, unknown>;
|
|
51
|
+
reverseBegin(): Generator<(K | V | undefined)[], void, unknown>;
|
|
52
52
|
/**
|
|
53
53
|
* Time Complexity: O(1)
|
|
54
54
|
* Space Complexity: O(1)
|
|
@@ -59,10 +59,9 @@ export declare class HashMap<K = any, V = any> {
|
|
|
59
59
|
* type, but typically it is a string or symbol.
|
|
60
60
|
* @param {V} [value] - The `value` parameter is an optional parameter of type `V`. It represents the
|
|
61
61
|
* value associated with the key being set in the data structure.
|
|
62
|
-
* @param {boolean} isObjectKey - A boolean flag indicating whether the key is an object key or not.
|
|
63
62
|
* @returns the size of the data structure after the key-value pair has been set.
|
|
64
63
|
*/
|
|
65
|
-
set(key: K, value?: V
|
|
64
|
+
set(key: K, value?: V): number;
|
|
66
65
|
/**
|
|
67
66
|
* Time Complexity: O(1)
|
|
68
67
|
* Space Complexity: O(1)
|
|
@@ -71,15 +70,12 @@ export declare class HashMap<K = any, V = any> {
|
|
|
71
70
|
* key directly or by using an index stored in the key object.
|
|
72
71
|
* @param {K} key - The `key` parameter is the key used to retrieve a value from the map. It can be
|
|
73
72
|
* of any type, but typically it is a string or symbol.
|
|
74
|
-
* @param {boolean} isObjectKey - The `isObjectKey` parameter is a boolean flag that indicates
|
|
75
|
-
* whether the `key` parameter is an object key or not. If `isObjectKey` is `true`, it means that
|
|
76
|
-
* `key` is an object key. If `isObjectKey` is `false`, it means that `key`
|
|
77
73
|
* @returns The value associated with the given key is being returned. If the key is an object key,
|
|
78
74
|
* the value is retrieved from the `_nodes` array using the index stored in the `OBJ_KEY_INDEX`
|
|
79
|
-
* property of the key. If the key is a string key, the value is retrieved from the `
|
|
75
|
+
* property of the key. If the key is a string key, the value is retrieved from the `_noObjMap` object
|
|
80
76
|
* using the key itself. If the key is not found, `undefined` is
|
|
81
77
|
*/
|
|
82
|
-
get(key: K
|
|
78
|
+
get(key: K): V | undefined;
|
|
83
79
|
/**
|
|
84
80
|
* Time Complexity: O(n), where n is the index.
|
|
85
81
|
* Space Complexity: O(1)
|
|
@@ -99,13 +95,10 @@ export declare class HashMap<K = any, V = any> {
|
|
|
99
95
|
* The `delete` function removes a key-value pair from a map-like data structure.
|
|
100
96
|
* @param {K} key - The `key` parameter is the key that you want to delete from the data structure.
|
|
101
97
|
* It can be of any type, but typically it is a string or an object.
|
|
102
|
-
* @param {boolean} isObjectKey - The `isObjectKey` parameter is a boolean flag that indicates
|
|
103
|
-
* whether the `key` parameter is an object key or not. If `isObjectKey` is `true`, it means that the
|
|
104
|
-
* `key` parameter is an object key. If `isObjectKey` is `false`, it means that the
|
|
105
98
|
* @returns a boolean value. It returns `true` if the deletion was successful, and `false` if the key
|
|
106
99
|
* was not found.
|
|
107
100
|
*/
|
|
108
|
-
delete(key: K
|
|
101
|
+
delete(key: K): boolean;
|
|
109
102
|
/**
|
|
110
103
|
* Time Complexity: O(n), where n is the index.
|
|
111
104
|
* Space Complexity: O(1)
|
|
@@ -142,6 +135,9 @@ export declare class HashMap<K = any, V = any> {
|
|
|
142
135
|
* HashMap. It takes three arguments:
|
|
143
136
|
*/
|
|
144
137
|
forEach(callback: (element: [K, V], index: number, hashMap: HashMap<K, V>) => void): void;
|
|
138
|
+
filter(predicate: (element: [K, V], map: HashMap<K, V>) => boolean): HashMap<K, V>;
|
|
139
|
+
map<NV>(callback: (element: [K, V], map: HashMap<K, V>) => NV): HashMap<K, NV>;
|
|
140
|
+
reduce<A>(callback: (accumulator: A, element: [K, V], map: HashMap<K, V>) => A, initialValue: A): A;
|
|
145
141
|
/**
|
|
146
142
|
* Time Complexity: O(n), where n is the number of elements in the HashMap.
|
|
147
143
|
* Space Complexity: O(1)
|
|
@@ -159,5 +155,5 @@ export declare class HashMap<K = any, V = any> {
|
|
|
159
155
|
* represents a node in a linked list. It contains a key-value pair and references to the previous
|
|
160
156
|
* and next nodes in the list.
|
|
161
157
|
*/
|
|
162
|
-
protected _deleteNode(node: HashMapLinkedNode<K, V>): void;
|
|
158
|
+
protected _deleteNode(node: HashMapLinkedNode<K, V | undefined>): void;
|
|
163
159
|
}
|
|
@@ -11,21 +11,27 @@ exports.HashMap = void 0;
|
|
|
11
11
|
const utils_1 = require("../../utils");
|
|
12
12
|
class HashMap {
|
|
13
13
|
/**
|
|
14
|
-
* The constructor initializes a
|
|
15
|
-
* @param
|
|
16
|
-
*
|
|
17
|
-
* `K` represents the type of the key and `V` represents the
|
|
14
|
+
* The constructor initializes a HashMapLinkedNode with an optional iterable of key-value pairs.
|
|
15
|
+
* @param options - The `options` parameter is an object that contains the `elements` property. The
|
|
16
|
+
* `elements` property is an iterable that contains key-value pairs represented as arrays `[K, V]`.
|
|
18
17
|
*/
|
|
19
|
-
constructor(
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
constructor(options = {
|
|
19
|
+
elements: [],
|
|
20
|
+
hashFn: (key) => String(key),
|
|
21
|
+
objHashFn: (key) => key
|
|
22
|
+
}) {
|
|
23
|
+
this._noObjMap = {};
|
|
24
|
+
this._objMap = new WeakMap();
|
|
23
25
|
this._size = 0;
|
|
24
|
-
Object.setPrototypeOf(this._orgMap, null);
|
|
25
26
|
this._sentinel = {};
|
|
26
27
|
this._sentinel.prev = this._sentinel.next = this._head = this._tail = this._sentinel;
|
|
27
|
-
|
|
28
|
-
|
|
28
|
+
const { elements, hashFn, objHashFn } = options;
|
|
29
|
+
this._hashFn = hashFn;
|
|
30
|
+
this._objHashFn = objHashFn;
|
|
31
|
+
if (elements) {
|
|
32
|
+
for (const el of elements) {
|
|
33
|
+
this.set(el[0], el[1]);
|
|
34
|
+
}
|
|
29
35
|
}
|
|
30
36
|
}
|
|
31
37
|
get size() {
|
|
@@ -88,52 +94,51 @@ class HashMap {
|
|
|
88
94
|
* type, but typically it is a string or symbol.
|
|
89
95
|
* @param {V} [value] - The `value` parameter is an optional parameter of type `V`. It represents the
|
|
90
96
|
* value associated with the key being set in the data structure.
|
|
91
|
-
* @param {boolean} isObjectKey - A boolean flag indicating whether the key is an object key or not.
|
|
92
97
|
* @returns the size of the data structure after the key-value pair has been set.
|
|
93
98
|
*/
|
|
94
|
-
set(key, value
|
|
95
|
-
let
|
|
96
|
-
if (
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
99
|
+
set(key, value) {
|
|
100
|
+
let node;
|
|
101
|
+
if ((0, utils_1.isWeakKey)(key)) {
|
|
102
|
+
const hash = this._objHashFn(key);
|
|
103
|
+
node = this._objMap.get(hash);
|
|
104
|
+
if (node) {
|
|
105
|
+
// If the node already exists, update its value
|
|
106
|
+
node.value = value;
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
// Create new node
|
|
110
|
+
node = { key: hash, value, prev: this._tail, next: this._sentinel };
|
|
111
|
+
// Add new nodes to _objMap and linked list
|
|
112
|
+
this._objMap.set(hash, node);
|
|
101
113
|
}
|
|
102
|
-
Object.defineProperty(key, this.OBJ_KEY_INDEX, {
|
|
103
|
-
value: this._nodes.length,
|
|
104
|
-
configurable: true
|
|
105
|
-
});
|
|
106
|
-
newTail = {
|
|
107
|
-
key: key,
|
|
108
|
-
value: value,
|
|
109
|
-
prev: this._tail,
|
|
110
|
-
next: this._sentinel
|
|
111
|
-
};
|
|
112
|
-
this._nodes.push(newTail);
|
|
113
114
|
}
|
|
114
115
|
else {
|
|
115
|
-
const
|
|
116
|
+
const hash = this._hashFn(key);
|
|
117
|
+
// Non-object keys are handled in the same way as the original implementation
|
|
118
|
+
node = this._noObjMap[hash];
|
|
116
119
|
if (node) {
|
|
117
120
|
node.value = value;
|
|
118
|
-
return this._size;
|
|
119
121
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
122
|
+
else {
|
|
123
|
+
this._noObjMap[hash] = node = {
|
|
124
|
+
key,
|
|
125
|
+
value,
|
|
126
|
+
prev: this._tail,
|
|
127
|
+
next: this._sentinel
|
|
128
|
+
};
|
|
129
|
+
}
|
|
126
130
|
}
|
|
127
131
|
if (this._size === 0) {
|
|
128
|
-
this._head =
|
|
129
|
-
this._sentinel.next =
|
|
132
|
+
this._head = node;
|
|
133
|
+
this._sentinel.next = node;
|
|
130
134
|
}
|
|
131
135
|
else {
|
|
132
|
-
this._tail.next =
|
|
136
|
+
this._tail.next = node;
|
|
133
137
|
}
|
|
134
|
-
this._tail =
|
|
135
|
-
this._sentinel.prev =
|
|
136
|
-
|
|
138
|
+
this._tail = node;
|
|
139
|
+
this._sentinel.prev = node;
|
|
140
|
+
this._size++;
|
|
141
|
+
return this._size;
|
|
137
142
|
}
|
|
138
143
|
/**
|
|
139
144
|
* Time Complexity: O(1)
|
|
@@ -143,21 +148,22 @@ class HashMap {
|
|
|
143
148
|
* key directly or by using an index stored in the key object.
|
|
144
149
|
* @param {K} key - The `key` parameter is the key used to retrieve a value from the map. It can be
|
|
145
150
|
* of any type, but typically it is a string or symbol.
|
|
146
|
-
* @param {boolean} isObjectKey - The `isObjectKey` parameter is a boolean flag that indicates
|
|
147
|
-
* whether the `key` parameter is an object key or not. If `isObjectKey` is `true`, it means that
|
|
148
|
-
* `key` is an object key. If `isObjectKey` is `false`, it means that `key`
|
|
149
151
|
* @returns The value associated with the given key is being returned. If the key is an object key,
|
|
150
152
|
* the value is retrieved from the `_nodes` array using the index stored in the `OBJ_KEY_INDEX`
|
|
151
|
-
* property of the key. If the key is a string key, the value is retrieved from the `
|
|
153
|
+
* property of the key. If the key is a string key, the value is retrieved from the `_noObjMap` object
|
|
152
154
|
* using the key itself. If the key is not found, `undefined` is
|
|
153
155
|
*/
|
|
154
|
-
get(key
|
|
155
|
-
if (
|
|
156
|
-
const
|
|
157
|
-
|
|
156
|
+
get(key) {
|
|
157
|
+
if ((0, utils_1.isWeakKey)(key)) {
|
|
158
|
+
const hash = this._objHashFn(key);
|
|
159
|
+
const node = this._objMap.get(hash);
|
|
160
|
+
return node ? node.value : undefined;
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
const hash = this._hashFn(key);
|
|
164
|
+
const node = this._noObjMap[hash];
|
|
165
|
+
return node ? node.value : undefined;
|
|
158
166
|
}
|
|
159
|
-
const node = this._orgMap[key];
|
|
160
|
-
return node ? node.value : undefined;
|
|
161
167
|
}
|
|
162
168
|
/**
|
|
163
169
|
* Time Complexity: O(n), where n is the index.
|
|
@@ -185,28 +191,32 @@ class HashMap {
|
|
|
185
191
|
* The `delete` function removes a key-value pair from a map-like data structure.
|
|
186
192
|
* @param {K} key - The `key` parameter is the key that you want to delete from the data structure.
|
|
187
193
|
* It can be of any type, but typically it is a string or an object.
|
|
188
|
-
* @param {boolean} isObjectKey - The `isObjectKey` parameter is a boolean flag that indicates
|
|
189
|
-
* whether the `key` parameter is an object key or not. If `isObjectKey` is `true`, it means that the
|
|
190
|
-
* `key` parameter is an object key. If `isObjectKey` is `false`, it means that the
|
|
191
194
|
* @returns a boolean value. It returns `true` if the deletion was successful, and `false` if the key
|
|
192
195
|
* was not found.
|
|
193
196
|
*/
|
|
194
|
-
delete(key
|
|
197
|
+
delete(key) {
|
|
195
198
|
let node;
|
|
196
|
-
if (
|
|
197
|
-
const
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
199
|
+
if ((0, utils_1.isWeakKey)(key)) {
|
|
200
|
+
const hash = this._objHashFn(key);
|
|
201
|
+
// Get nodes from WeakMap
|
|
202
|
+
node = this._objMap.get(hash);
|
|
203
|
+
if (!node) {
|
|
204
|
+
return false; // If the node does not exist, return false
|
|
205
|
+
}
|
|
206
|
+
// Remove nodes from WeakMap
|
|
207
|
+
this._objMap.delete(hash);
|
|
203
208
|
}
|
|
204
209
|
else {
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
210
|
+
const hash = this._hashFn(key);
|
|
211
|
+
// Get nodes from noObjMap
|
|
212
|
+
node = this._noObjMap[hash];
|
|
213
|
+
if (!node) {
|
|
214
|
+
return false; // If the node does not exist, return false
|
|
215
|
+
}
|
|
216
|
+
// Remove nodes from orgMap
|
|
217
|
+
delete this._noObjMap[hash];
|
|
209
218
|
}
|
|
219
|
+
// Remove node from doubly linked list
|
|
210
220
|
this._deleteNode(node);
|
|
211
221
|
return true;
|
|
212
222
|
}
|
|
@@ -246,13 +256,7 @@ class HashMap {
|
|
|
246
256
|
* The `clear` function clears all the elements in a data structure and resets its properties.
|
|
247
257
|
*/
|
|
248
258
|
clear() {
|
|
249
|
-
|
|
250
|
-
// this._nodes.forEach(el => {
|
|
251
|
-
// delete (<Record<symbol, number>><unknown>el.key)[OBJ_KEY_INDEX];
|
|
252
|
-
// });
|
|
253
|
-
this._nodes = [];
|
|
254
|
-
this._orgMap = {};
|
|
255
|
-
Object.setPrototypeOf(this._orgMap, null);
|
|
259
|
+
this._noObjMap = {};
|
|
256
260
|
this._size = 0;
|
|
257
261
|
this._head = this._tail = this._sentinel.prev = this._sentinel.next = this._sentinel;
|
|
258
262
|
}
|
|
@@ -273,6 +277,30 @@ class HashMap {
|
|
|
273
277
|
node = node.next;
|
|
274
278
|
}
|
|
275
279
|
}
|
|
280
|
+
filter(predicate) {
|
|
281
|
+
const filteredMap = new HashMap();
|
|
282
|
+
for (const [key, value] of this) {
|
|
283
|
+
if (predicate([key, value], this)) {
|
|
284
|
+
filteredMap.set(key, value);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return filteredMap;
|
|
288
|
+
}
|
|
289
|
+
map(callback) {
|
|
290
|
+
const mappedMap = new HashMap();
|
|
291
|
+
for (const [key, value] of this) {
|
|
292
|
+
const newValue = callback([key, value], this);
|
|
293
|
+
mappedMap.set(key, newValue);
|
|
294
|
+
}
|
|
295
|
+
return mappedMap;
|
|
296
|
+
}
|
|
297
|
+
reduce(callback, initialValue) {
|
|
298
|
+
let accumulator = initialValue;
|
|
299
|
+
for (const element of this) {
|
|
300
|
+
accumulator = callback(accumulator, element, this);
|
|
301
|
+
}
|
|
302
|
+
return accumulator;
|
|
303
|
+
}
|
|
276
304
|
/**
|
|
277
305
|
* Time Complexity: O(n), where n is the number of elements in the HashMap.
|
|
278
306
|
* Space Complexity: O(1)
|
|
@@ -15,8 +15,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./hash-table"), exports);
|
|
18
|
-
__exportStar(require("./coordinate-map"), exports);
|
|
19
|
-
__exportStar(require("./coordinate-set"), exports);
|
|
20
|
-
__exportStar(require("./tree-map"), exports);
|
|
21
|
-
__exportStar(require("./tree-set"), exports);
|
|
22
18
|
__exportStar(require("./hash-map"), exports);
|
|
@@ -14,9 +14,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./coordinate-map"), exports);
|
|
18
|
-
__exportStar(require("./coordinate-set"), exports);
|
|
19
17
|
__exportStar(require("./hash-map"), exports);
|
|
20
18
|
__exportStar(require("./hash-table"), exports);
|
|
21
|
-
__exportStar(require("./tree-map"), exports);
|
|
22
|
-
__exportStar(require("./tree-set"), exports);
|
package/dist/utils/utils.d.ts
CHANGED
|
@@ -20,5 +20,5 @@ export declare const trampolineAsync: (fn: TrlAsyncFn) => ((...args: [...Paramet
|
|
|
20
20
|
export declare const getMSB: (value: number) => number;
|
|
21
21
|
export declare const rangeCheck: (index: number, min: number, max: number, message?: string) => void;
|
|
22
22
|
export declare const throwRangeError: (message?: string) => void;
|
|
23
|
-
export declare const
|
|
23
|
+
export declare const isWeakKey: (input: unknown) => input is object;
|
|
24
24
|
export declare const calcMinUnitsRequired: (totalQuantity: number, unitSize: number) => number;
|
package/dist/utils/utils.js
CHANGED
|
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.calcMinUnitsRequired = exports.
|
|
12
|
+
exports.calcMinUnitsRequired = exports.isWeakKey = exports.throwRangeError = exports.rangeCheck = exports.getMSB = exports.trampolineAsync = exports.trampoline = exports.toThunk = exports.isThunk = exports.THUNK_SYMBOL = exports.arrayRemove = exports.uuidV4 = void 0;
|
|
13
13
|
const uuidV4 = function () {
|
|
14
14
|
return 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'.replace(/[x]/g, function (c) {
|
|
15
15
|
const r = (Math.random() * 16) | 0, v = c == 'x' ? r : (r & 0x3) | 0x8;
|
|
@@ -80,10 +80,10 @@ const throwRangeError = (message = 'The value is off-limits.') => {
|
|
|
80
80
|
throw new RangeError(message);
|
|
81
81
|
};
|
|
82
82
|
exports.throwRangeError = throwRangeError;
|
|
83
|
-
const
|
|
83
|
+
const isWeakKey = (input) => {
|
|
84
84
|
const inputType = typeof input;
|
|
85
85
|
return (inputType === 'object' && input !== null) || inputType === 'function';
|
|
86
86
|
};
|
|
87
|
-
exports.
|
|
87
|
+
exports.isWeakKey = isWeakKey;
|
|
88
88
|
const calcMinUnitsRequired = (totalQuantity, unitSize) => Math.floor((totalQuantity + unitSize - 1) / unitSize);
|
|
89
89
|
exports.calcMinUnitsRequired = calcMinUnitsRequired;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "directed-graph-typed",
|
|
3
|
-
"version": "1.46.
|
|
3
|
+
"version": "1.46.5",
|
|
4
4
|
"description": "Directed Graph. Javascript & Typescript Data Structure.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -147,6 +147,6 @@
|
|
|
147
147
|
"typescript": "^4.9.5"
|
|
148
148
|
},
|
|
149
149
|
"dependencies": {
|
|
150
|
-
"data-structure-typed": "^1.46.
|
|
150
|
+
"data-structure-typed": "^1.46.5"
|
|
151
151
|
}
|
|
152
152
|
}
|
|
@@ -6,31 +6,41 @@
|
|
|
6
6
|
* @license MIT License
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import {
|
|
10
|
-
import { HashMapLinkedNode,
|
|
9
|
+
import { isWeakKey, rangeCheck } from '../../utils';
|
|
10
|
+
import { HashMapLinkedNode, HashMapOptions } from '../../types';
|
|
11
11
|
|
|
12
12
|
export class HashMap<K = any, V = any> {
|
|
13
|
-
|
|
14
|
-
protected
|
|
15
|
-
protected
|
|
16
|
-
protected _head: HashMapLinkedNode<K, V>;
|
|
17
|
-
protected _tail: HashMapLinkedNode<K, V>;
|
|
18
|
-
protected readonly _sentinel: HashMapLinkedNode<K, V>;
|
|
13
|
+
|
|
14
|
+
protected _noObjMap: Record<string, HashMapLinkedNode<K, V | undefined>> = {};
|
|
15
|
+
protected _objMap = new WeakMap<object, HashMapLinkedNode<K, V | undefined>>();
|
|
16
|
+
protected _head: HashMapLinkedNode<K, V | undefined>;
|
|
17
|
+
protected _tail: HashMapLinkedNode<K, V | undefined>;
|
|
18
|
+
protected readonly _sentinel: HashMapLinkedNode<K, V | undefined>;
|
|
19
|
+
protected _hashFn: (key: K) => string;
|
|
20
|
+
protected _objHashFn: (key: K) => object;
|
|
19
21
|
|
|
20
22
|
/**
|
|
21
|
-
* The constructor initializes a
|
|
22
|
-
* @param
|
|
23
|
-
*
|
|
24
|
-
* `K` represents the type of the key and `V` represents the
|
|
23
|
+
* The constructor initializes a HashMapLinkedNode with an optional iterable of key-value pairs.
|
|
24
|
+
* @param options - The `options` parameter is an object that contains the `elements` property. The
|
|
25
|
+
* `elements` property is an iterable that contains key-value pairs represented as arrays `[K, V]`.
|
|
25
26
|
*/
|
|
26
|
-
constructor(
|
|
27
|
-
|
|
27
|
+
constructor(options: HashMapOptions<K, V> = {
|
|
28
|
+
elements: [],
|
|
29
|
+
hashFn: (key: K) => String(key),
|
|
30
|
+
objHashFn: (key: K) => (<object>key)
|
|
31
|
+
}) {
|
|
28
32
|
this._sentinel = <HashMapLinkedNode<K, V>>{};
|
|
29
33
|
this._sentinel.prev = this._sentinel.next = this._head = this._tail = this._sentinel;
|
|
30
34
|
|
|
31
|
-
|
|
32
|
-
|
|
35
|
+
const { elements, hashFn, objHashFn } = options;
|
|
36
|
+
this._hashFn = hashFn;
|
|
37
|
+
this._objHashFn = objHashFn;
|
|
38
|
+
if (elements) {
|
|
39
|
+
for (const el of elements) {
|
|
40
|
+
this.set(el[0], el[1]);
|
|
41
|
+
}
|
|
33
42
|
}
|
|
43
|
+
|
|
34
44
|
}
|
|
35
45
|
|
|
36
46
|
protected _size = 0;
|
|
@@ -98,50 +108,53 @@ export class HashMap<K = any, V = any> {
|
|
|
98
108
|
* type, but typically it is a string or symbol.
|
|
99
109
|
* @param {V} [value] - The `value` parameter is an optional parameter of type `V`. It represents the
|
|
100
110
|
* value associated with the key being set in the data structure.
|
|
101
|
-
* @param {boolean} isObjectKey - A boolean flag indicating whether the key is an object key or not.
|
|
102
111
|
* @returns the size of the data structure after the key-value pair has been set.
|
|
103
112
|
*/
|
|
104
|
-
set(key: K, value?: V
|
|
105
|
-
let
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
113
|
+
set(key: K, value?: V) {
|
|
114
|
+
let node;
|
|
115
|
+
|
|
116
|
+
if (isWeakKey(key)) {
|
|
117
|
+
const hash = this._objHashFn(key);
|
|
118
|
+
node = this._objMap.get(hash);
|
|
119
|
+
|
|
120
|
+
if (node) {
|
|
121
|
+
// If the node already exists, update its value
|
|
122
|
+
node.value = value;
|
|
123
|
+
} else {
|
|
124
|
+
// Create new node
|
|
125
|
+
node = { key: <K>hash, value, prev: this._tail, next: this._sentinel };
|
|
126
|
+
|
|
127
|
+
// Add new nodes to _objMap and linked list
|
|
128
|
+
this._objMap.set(hash, node);
|
|
111
129
|
}
|
|
112
|
-
Object.defineProperty(key, this.OBJ_KEY_INDEX, {
|
|
113
|
-
value: this._nodes.length,
|
|
114
|
-
configurable: true
|
|
115
|
-
});
|
|
116
|
-
newTail = {
|
|
117
|
-
key: key,
|
|
118
|
-
value: <V>value,
|
|
119
|
-
prev: this._tail,
|
|
120
|
-
next: this._sentinel
|
|
121
|
-
};
|
|
122
|
-
this._nodes.push(newTail);
|
|
123
130
|
} else {
|
|
124
|
-
const
|
|
131
|
+
const hash = this._hashFn(key);
|
|
132
|
+
// Non-object keys are handled in the same way as the original implementation
|
|
133
|
+
node = this._noObjMap[hash];
|
|
125
134
|
if (node) {
|
|
126
|
-
node.value =
|
|
127
|
-
|
|
135
|
+
node.value = value;
|
|
136
|
+
} else {
|
|
137
|
+
this._noObjMap[hash] = node = {
|
|
138
|
+
key,
|
|
139
|
+
value,
|
|
140
|
+
prev: this._tail,
|
|
141
|
+
next: this._sentinel
|
|
142
|
+
};
|
|
128
143
|
}
|
|
129
|
-
this._orgMap[<string>(<unknown>key)] = newTail = {
|
|
130
|
-
key: key,
|
|
131
|
-
value: <V>value,
|
|
132
|
-
prev: this._tail,
|
|
133
|
-
next: this._sentinel
|
|
134
|
-
};
|
|
135
144
|
}
|
|
145
|
+
|
|
136
146
|
if (this._size === 0) {
|
|
137
|
-
this._head =
|
|
138
|
-
this._sentinel.next =
|
|
147
|
+
this._head = node;
|
|
148
|
+
this._sentinel.next = node;
|
|
139
149
|
} else {
|
|
140
|
-
this._tail.next =
|
|
150
|
+
this._tail.next = node;
|
|
141
151
|
}
|
|
142
|
-
|
|
143
|
-
this.
|
|
144
|
-
|
|
152
|
+
|
|
153
|
+
this._tail = node;
|
|
154
|
+
this._sentinel.prev = node;
|
|
155
|
+
this._size++;
|
|
156
|
+
|
|
157
|
+
return this._size;
|
|
145
158
|
}
|
|
146
159
|
|
|
147
160
|
/**
|
|
@@ -152,21 +165,21 @@ export class HashMap<K = any, V = any> {
|
|
|
152
165
|
* key directly or by using an index stored in the key object.
|
|
153
166
|
* @param {K} key - The `key` parameter is the key used to retrieve a value from the map. It can be
|
|
154
167
|
* of any type, but typically it is a string or symbol.
|
|
155
|
-
* @param {boolean} isObjectKey - The `isObjectKey` parameter is a boolean flag that indicates
|
|
156
|
-
* whether the `key` parameter is an object key or not. If `isObjectKey` is `true`, it means that
|
|
157
|
-
* `key` is an object key. If `isObjectKey` is `false`, it means that `key`
|
|
158
168
|
* @returns The value associated with the given key is being returned. If the key is an object key,
|
|
159
169
|
* the value is retrieved from the `_nodes` array using the index stored in the `OBJ_KEY_INDEX`
|
|
160
|
-
* property of the key. If the key is a string key, the value is retrieved from the `
|
|
170
|
+
* property of the key. If the key is a string key, the value is retrieved from the `_noObjMap` object
|
|
161
171
|
* using the key itself. If the key is not found, `undefined` is
|
|
162
172
|
*/
|
|
163
|
-
get(key: K
|
|
164
|
-
if (
|
|
165
|
-
const
|
|
166
|
-
|
|
173
|
+
get(key: K): V | undefined {
|
|
174
|
+
if (isWeakKey(key)) {
|
|
175
|
+
const hash = this._objHashFn(key);
|
|
176
|
+
const node = this._objMap.get(hash);
|
|
177
|
+
return node ? node.value : undefined;
|
|
178
|
+
} else {
|
|
179
|
+
const hash = this._hashFn(key);
|
|
180
|
+
const node = this._noObjMap[hash];
|
|
181
|
+
return node ? node.value : undefined;
|
|
167
182
|
}
|
|
168
|
-
const node = this._orgMap[<string>(<unknown>key)];
|
|
169
|
-
return node ? node.value : undefined;
|
|
170
183
|
}
|
|
171
184
|
|
|
172
185
|
/**
|
|
@@ -196,25 +209,37 @@ export class HashMap<K = any, V = any> {
|
|
|
196
209
|
* The `delete` function removes a key-value pair from a map-like data structure.
|
|
197
210
|
* @param {K} key - The `key` parameter is the key that you want to delete from the data structure.
|
|
198
211
|
* It can be of any type, but typically it is a string or an object.
|
|
199
|
-
* @param {boolean} isObjectKey - The `isObjectKey` parameter is a boolean flag that indicates
|
|
200
|
-
* whether the `key` parameter is an object key or not. If `isObjectKey` is `true`, it means that the
|
|
201
|
-
* `key` parameter is an object key. If `isObjectKey` is `false`, it means that the
|
|
202
212
|
* @returns a boolean value. It returns `true` if the deletion was successful, and `false` if the key
|
|
203
213
|
* was not found.
|
|
204
214
|
*/
|
|
205
|
-
delete(key: K
|
|
215
|
+
delete(key: K) {
|
|
206
216
|
let node;
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
node = this.
|
|
212
|
-
|
|
217
|
+
|
|
218
|
+
if (isWeakKey(key)) {
|
|
219
|
+
const hash = this._objHashFn(key);
|
|
220
|
+
// Get nodes from WeakMap
|
|
221
|
+
node = this._objMap.get(hash);
|
|
222
|
+
|
|
223
|
+
if (!node) {
|
|
224
|
+
return false; // If the node does not exist, return false
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Remove nodes from WeakMap
|
|
228
|
+
this._objMap.delete(hash);
|
|
213
229
|
} else {
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
230
|
+
const hash = this._hashFn(key);
|
|
231
|
+
// Get nodes from noObjMap
|
|
232
|
+
node = this._noObjMap[hash];
|
|
233
|
+
|
|
234
|
+
if (!node) {
|
|
235
|
+
return false; // If the node does not exist, return false
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Remove nodes from orgMap
|
|
239
|
+
delete this._noObjMap[hash];
|
|
217
240
|
}
|
|
241
|
+
|
|
242
|
+
// Remove node from doubly linked list
|
|
218
243
|
this._deleteNode(node);
|
|
219
244
|
return true;
|
|
220
245
|
}
|
|
@@ -257,13 +282,7 @@ export class HashMap<K = any, V = any> {
|
|
|
257
282
|
* The `clear` function clears all the elements in a data structure and resets its properties.
|
|
258
283
|
*/
|
|
259
284
|
clear() {
|
|
260
|
-
|
|
261
|
-
// this._nodes.forEach(el => {
|
|
262
|
-
// delete (<Record<symbol, number>><unknown>el.key)[OBJ_KEY_INDEX];
|
|
263
|
-
// });
|
|
264
|
-
this._nodes = [];
|
|
265
|
-
this._orgMap = {};
|
|
266
|
-
Object.setPrototypeOf(this._orgMap, null);
|
|
285
|
+
this._noObjMap = {};
|
|
267
286
|
this._size = 0;
|
|
268
287
|
this._head = this._tail = this._sentinel.prev = this._sentinel.next = this._sentinel;
|
|
269
288
|
}
|
|
@@ -286,6 +305,33 @@ export class HashMap<K = any, V = any> {
|
|
|
286
305
|
}
|
|
287
306
|
}
|
|
288
307
|
|
|
308
|
+
filter(predicate: (element: [K, V], map: HashMap<K, V>) => boolean): HashMap<K, V> {
|
|
309
|
+
const filteredMap = new HashMap<K, V>();
|
|
310
|
+
for (const [key, value] of this) {
|
|
311
|
+
if (predicate([key, value], this)) {
|
|
312
|
+
filteredMap.set(key, value);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
return filteredMap;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
map<NV>(callback: (element: [K, V], map: HashMap<K, V>) => NV): HashMap<K, NV> {
|
|
319
|
+
const mappedMap = new HashMap<K, NV>();
|
|
320
|
+
for (const [key, value] of this) {
|
|
321
|
+
const newValue = callback([key, value], this);
|
|
322
|
+
mappedMap.set(key, newValue);
|
|
323
|
+
}
|
|
324
|
+
return mappedMap;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
reduce<A>(callback: (accumulator: A, element: [K, V], map: HashMap<K, V>) => A, initialValue: A): A {
|
|
328
|
+
let accumulator = initialValue;
|
|
329
|
+
for (const element of this) {
|
|
330
|
+
accumulator = callback(accumulator, element, this);
|
|
331
|
+
}
|
|
332
|
+
return accumulator;
|
|
333
|
+
}
|
|
334
|
+
|
|
289
335
|
/**
|
|
290
336
|
* Time Complexity: O(n), where n is the number of elements in the HashMap.
|
|
291
337
|
* Space Complexity: O(1)
|
|
@@ -310,16 +356,19 @@ export class HashMap<K = any, V = any> {
|
|
|
310
356
|
* represents a node in a linked list. It contains a key-value pair and references to the previous
|
|
311
357
|
* and next nodes in the list.
|
|
312
358
|
*/
|
|
313
|
-
protected _deleteNode(node: HashMapLinkedNode<K, V>) {
|
|
359
|
+
protected _deleteNode(node: HashMapLinkedNode<K, V | undefined>) {
|
|
314
360
|
const { prev, next } = node;
|
|
315
361
|
prev.next = next;
|
|
316
362
|
next.prev = prev;
|
|
363
|
+
|
|
317
364
|
if (node === this._head) {
|
|
318
365
|
this._head = next;
|
|
319
366
|
}
|
|
367
|
+
|
|
320
368
|
if (node === this._tail) {
|
|
321
369
|
this._tail = prev;
|
|
322
370
|
}
|
|
371
|
+
|
|
323
372
|
this._size -= 1;
|
|
324
373
|
}
|
|
325
374
|
}
|
package/src/utils/utils.ts
CHANGED
|
@@ -93,7 +93,7 @@ export const throwRangeError = (message = 'The value is off-limits.'): void => {
|
|
|
93
93
|
throw new RangeError(message);
|
|
94
94
|
};
|
|
95
95
|
|
|
96
|
-
export const
|
|
96
|
+
export const isWeakKey = (input: unknown): input is object => {
|
|
97
97
|
const inputType = typeof input;
|
|
98
98
|
return (inputType === 'object' && input !== null) || inputType === 'function';
|
|
99
99
|
};
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* data-structure-typed
|
|
3
|
-
*
|
|
4
|
-
* @author Tyler Zeng
|
|
5
|
-
* @copyright Copyright (c) 2022 Tyler Zeng <zrwusa@gmail.com>
|
|
6
|
-
* @license MIT License
|
|
7
|
-
*/
|
|
8
|
-
export declare class CoordinateMap<V> extends Map<any, V> {
|
|
9
|
-
constructor(joint?: string);
|
|
10
|
-
protected _joint: string;
|
|
11
|
-
get joint(): string;
|
|
12
|
-
/**
|
|
13
|
-
* The "has" function overrides the base class's "has" function and checks if a key exists in the map by joining the
|
|
14
|
-
* key array with a specified delimiter.
|
|
15
|
-
* @param {number[]} key - The parameter "key" is an array of numbers.
|
|
16
|
-
* @returns The `has` method is being overridden to return the result of calling the `has` method of the superclass
|
|
17
|
-
* (`super.has`) with the `key` array joined together using the `_joint` property.
|
|
18
|
-
*/
|
|
19
|
-
has(key: number[]): boolean;
|
|
20
|
-
/**
|
|
21
|
-
* The function overrides the set method of a Map object to convert the key from an array to a string using a specified
|
|
22
|
-
* delimiter before calling the original set method.
|
|
23
|
-
* @param {number[]} key - The key parameter is an array of numbers.
|
|
24
|
-
* @param {V} value - The value parameter is the value that you want to associate with the specified key.
|
|
25
|
-
* @returns The `set` method is returning the result of calling the `set` method of the superclass
|
|
26
|
-
* (`super.set(key.join(this._joint), value)`).
|
|
27
|
-
*/
|
|
28
|
-
set(key: number[], value: V): this;
|
|
29
|
-
/**
|
|
30
|
-
* The function overrides the get method to join the key array with a specified joint and then calls the super get
|
|
31
|
-
* method.
|
|
32
|
-
* @param {number[]} key - An array of numbers
|
|
33
|
-
* @returns The code is returning the value associated with the specified key in the map.
|
|
34
|
-
*/
|
|
35
|
-
get(key: number[]): V | undefined;
|
|
36
|
-
/**
|
|
37
|
-
* The function overrides the delete method and joins the key array using a specified joint character before calling
|
|
38
|
-
* the super delete method.
|
|
39
|
-
* @param {number[]} key - An array of numbers that represents the key to be deleted.
|
|
40
|
-
* @returns The `delete` method is returning the result of calling the `delete` method on the superclass, with the
|
|
41
|
-
* `key` array joined together using the `_joint` property.
|
|
42
|
-
*/
|
|
43
|
-
delete(key: number[]): boolean;
|
|
44
|
-
}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CoordinateMap = void 0;
|
|
4
|
-
/**
|
|
5
|
-
* data-structure-typed
|
|
6
|
-
*
|
|
7
|
-
* @author Tyler Zeng
|
|
8
|
-
* @copyright Copyright (c) 2022 Tyler Zeng <zrwusa@gmail.com>
|
|
9
|
-
* @license MIT License
|
|
10
|
-
*/
|
|
11
|
-
class CoordinateMap extends Map {
|
|
12
|
-
constructor(joint) {
|
|
13
|
-
super();
|
|
14
|
-
this._joint = '_';
|
|
15
|
-
if (joint !== undefined)
|
|
16
|
-
this._joint = joint;
|
|
17
|
-
}
|
|
18
|
-
get joint() {
|
|
19
|
-
return this._joint;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* The "has" function overrides the base class's "has" function and checks if a key exists in the map by joining the
|
|
23
|
-
* key array with a specified delimiter.
|
|
24
|
-
* @param {number[]} key - The parameter "key" is an array of numbers.
|
|
25
|
-
* @returns The `has` method is being overridden to return the result of calling the `has` method of the superclass
|
|
26
|
-
* (`super.has`) with the `key` array joined together using the `_joint` property.
|
|
27
|
-
*/
|
|
28
|
-
has(key) {
|
|
29
|
-
return super.has(key.join(this._joint));
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* The function overrides the set method of a Map object to convert the key from an array to a string using a specified
|
|
33
|
-
* delimiter before calling the original set method.
|
|
34
|
-
* @param {number[]} key - The key parameter is an array of numbers.
|
|
35
|
-
* @param {V} value - The value parameter is the value that you want to associate with the specified key.
|
|
36
|
-
* @returns The `set` method is returning the result of calling the `set` method of the superclass
|
|
37
|
-
* (`super.set(key.join(this._joint), value)`).
|
|
38
|
-
*/
|
|
39
|
-
set(key, value) {
|
|
40
|
-
return super.set(key.join(this._joint), value);
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* The function overrides the get method to join the key array with a specified joint and then calls the super get
|
|
44
|
-
* method.
|
|
45
|
-
* @param {number[]} key - An array of numbers
|
|
46
|
-
* @returns The code is returning the value associated with the specified key in the map.
|
|
47
|
-
*/
|
|
48
|
-
get(key) {
|
|
49
|
-
return super.get(key.join(this._joint));
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* The function overrides the delete method and joins the key array using a specified joint character before calling
|
|
53
|
-
* the super delete method.
|
|
54
|
-
* @param {number[]} key - An array of numbers that represents the key to be deleted.
|
|
55
|
-
* @returns The `delete` method is returning the result of calling the `delete` method on the superclass, with the
|
|
56
|
-
* `key` array joined together using the `_joint` property.
|
|
57
|
-
*/
|
|
58
|
-
delete(key) {
|
|
59
|
-
return super.delete(key.join(this._joint));
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
exports.CoordinateMap = CoordinateMap;
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* data-structure-typed
|
|
3
|
-
*
|
|
4
|
-
* @author Tyler Zeng
|
|
5
|
-
* @copyright Copyright (c) 2022 Tyler Zeng <zrwusa@gmail.com>
|
|
6
|
-
* @license MIT License
|
|
7
|
-
*/
|
|
8
|
-
export declare class CoordinateSet extends Set<any> {
|
|
9
|
-
constructor(joint?: string);
|
|
10
|
-
protected _joint: string;
|
|
11
|
-
get joint(): string;
|
|
12
|
-
/**
|
|
13
|
-
* The "has" function overrides the "has" method of the superclass and checks if a value exists in an array after
|
|
14
|
-
* joining its elements with a specified separator.
|
|
15
|
-
* @param {number[]} value - The parameter "value" is an array of numbers.
|
|
16
|
-
* @returns The overridden `has` method is returning the result of calling the `has` method of the superclass, passing
|
|
17
|
-
* in the joined value as an argument.
|
|
18
|
-
*/
|
|
19
|
-
has(value: number[]): boolean;
|
|
20
|
-
/**
|
|
21
|
-
* The "add" function overrides the parent class's "add" function by joining the elements of the input array with a
|
|
22
|
-
* specified delimiter before calling the parent class's "add" function.
|
|
23
|
-
* @param {number[]} value - An array of numbers
|
|
24
|
-
* @returns The overridden `add` method is returning the result of calling the `add` method of the superclass
|
|
25
|
-
* (`super.add`) with the joined string representation of the `value` array (`value.join(this._joint)`).
|
|
26
|
-
*/
|
|
27
|
-
add(value: number[]): this;
|
|
28
|
-
/**
|
|
29
|
-
* The function overrides the delete method and deletes an element from a Set by joining the elements of the input
|
|
30
|
-
* array with a specified joint and then calling the delete method of the parent class.
|
|
31
|
-
* @param {number[]} value - An array of numbers
|
|
32
|
-
* @returns The `delete` method is returning the result of calling the `delete` method of the superclass, with the
|
|
33
|
-
* `value` array joined together using the `_joint` property.
|
|
34
|
-
*/
|
|
35
|
-
delete(value: number[]): boolean;
|
|
36
|
-
}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CoordinateSet = void 0;
|
|
4
|
-
/**
|
|
5
|
-
* data-structure-typed
|
|
6
|
-
*
|
|
7
|
-
* @author Tyler Zeng
|
|
8
|
-
* @copyright Copyright (c) 2022 Tyler Zeng <zrwusa@gmail.com>
|
|
9
|
-
* @license MIT License
|
|
10
|
-
*/
|
|
11
|
-
class CoordinateSet extends Set {
|
|
12
|
-
constructor(joint) {
|
|
13
|
-
super();
|
|
14
|
-
this._joint = '_';
|
|
15
|
-
if (joint !== undefined)
|
|
16
|
-
this._joint = joint;
|
|
17
|
-
}
|
|
18
|
-
get joint() {
|
|
19
|
-
return this._joint;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* The "has" function overrides the "has" method of the superclass and checks if a value exists in an array after
|
|
23
|
-
* joining its elements with a specified separator.
|
|
24
|
-
* @param {number[]} value - The parameter "value" is an array of numbers.
|
|
25
|
-
* @returns The overridden `has` method is returning the result of calling the `has` method of the superclass, passing
|
|
26
|
-
* in the joined value as an argument.
|
|
27
|
-
*/
|
|
28
|
-
has(value) {
|
|
29
|
-
return super.has(value.join(this._joint));
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* The "add" function overrides the parent class's "add" function by joining the elements of the input array with a
|
|
33
|
-
* specified delimiter before calling the parent class's "add" function.
|
|
34
|
-
* @param {number[]} value - An array of numbers
|
|
35
|
-
* @returns The overridden `add` method is returning the result of calling the `add` method of the superclass
|
|
36
|
-
* (`super.add`) with the joined string representation of the `value` array (`value.join(this._joint)`).
|
|
37
|
-
*/
|
|
38
|
-
add(value) {
|
|
39
|
-
return super.add(value.join(this._joint));
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* The function overrides the delete method and deletes an element from a Set by joining the elements of the input
|
|
43
|
-
* array with a specified joint and then calling the delete method of the parent class.
|
|
44
|
-
* @param {number[]} value - An array of numbers
|
|
45
|
-
* @returns The `delete` method is returning the result of calling the `delete` method of the superclass, with the
|
|
46
|
-
* `value` array joined together using the `_joint` property.
|
|
47
|
-
*/
|
|
48
|
-
delete(value) {
|
|
49
|
-
return super.delete(value.join(this._joint));
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
exports.CoordinateSet = CoordinateSet;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* data-structure-typed
|
|
3
|
-
*
|
|
4
|
-
* @author Tyler Zeng
|
|
5
|
-
* @copyright Copyright (c) 2022 Tyler Zeng <zrwusa@gmail.com>
|
|
6
|
-
* @license MIT License
|
|
7
|
-
*/
|
|
8
|
-
export class CoordinateMap<V> extends Map<any, V> {
|
|
9
|
-
constructor(joint?: string) {
|
|
10
|
-
super();
|
|
11
|
-
if (joint !== undefined) this._joint = joint;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
protected _joint = '_';
|
|
15
|
-
|
|
16
|
-
get joint(): string {
|
|
17
|
-
return this._joint;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* The "has" function overrides the base class's "has" function and checks if a key exists in the map by joining the
|
|
22
|
-
* key array with a specified delimiter.
|
|
23
|
-
* @param {number[]} key - The parameter "key" is an array of numbers.
|
|
24
|
-
* @returns The `has` method is being overridden to return the result of calling the `has` method of the superclass
|
|
25
|
-
* (`super.has`) with the `key` array joined together using the `_joint` property.
|
|
26
|
-
*/
|
|
27
|
-
override has(key: number[]) {
|
|
28
|
-
return super.has(key.join(this._joint));
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* The function overrides the set method of a Map object to convert the key from an array to a string using a specified
|
|
33
|
-
* delimiter before calling the original set method.
|
|
34
|
-
* @param {number[]} key - The key parameter is an array of numbers.
|
|
35
|
-
* @param {V} value - The value parameter is the value that you want to associate with the specified key.
|
|
36
|
-
* @returns The `set` method is returning the result of calling the `set` method of the superclass
|
|
37
|
-
* (`super.set(key.join(this._joint), value)`).
|
|
38
|
-
*/
|
|
39
|
-
override set(key: number[], value: V) {
|
|
40
|
-
return super.set(key.join(this._joint), value);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* The function overrides the get method to join the key array with a specified joint and then calls the super get
|
|
45
|
-
* method.
|
|
46
|
-
* @param {number[]} key - An array of numbers
|
|
47
|
-
* @returns The code is returning the value associated with the specified key in the map.
|
|
48
|
-
*/
|
|
49
|
-
override get(key: number[]) {
|
|
50
|
-
return super.get(key.join(this._joint));
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* The function overrides the delete method and joins the key array using a specified joint character before calling
|
|
55
|
-
* the super delete method.
|
|
56
|
-
* @param {number[]} key - An array of numbers that represents the key to be deleted.
|
|
57
|
-
* @returns The `delete` method is returning the result of calling the `delete` method on the superclass, with the
|
|
58
|
-
* `key` array joined together using the `_joint` property.
|
|
59
|
-
*/
|
|
60
|
-
override delete(key: number[]) {
|
|
61
|
-
return super.delete(key.join(this._joint));
|
|
62
|
-
}
|
|
63
|
-
}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* data-structure-typed
|
|
3
|
-
*
|
|
4
|
-
* @author Tyler Zeng
|
|
5
|
-
* @copyright Copyright (c) 2022 Tyler Zeng <zrwusa@gmail.com>
|
|
6
|
-
* @license MIT License
|
|
7
|
-
*/
|
|
8
|
-
export class CoordinateSet extends Set<any> {
|
|
9
|
-
constructor(joint?: string) {
|
|
10
|
-
super();
|
|
11
|
-
if (joint !== undefined) this._joint = joint;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
protected _joint = '_';
|
|
15
|
-
|
|
16
|
-
get joint(): string {
|
|
17
|
-
return this._joint;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* The "has" function overrides the "has" method of the superclass and checks if a value exists in an array after
|
|
22
|
-
* joining its elements with a specified separator.
|
|
23
|
-
* @param {number[]} value - The parameter "value" is an array of numbers.
|
|
24
|
-
* @returns The overridden `has` method is returning the result of calling the `has` method of the superclass, passing
|
|
25
|
-
* in the joined value as an argument.
|
|
26
|
-
*/
|
|
27
|
-
override has(value: number[]) {
|
|
28
|
-
return super.has(value.join(this._joint));
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* The "add" function overrides the parent class's "add" function by joining the elements of the input array with a
|
|
33
|
-
* specified delimiter before calling the parent class's "add" function.
|
|
34
|
-
* @param {number[]} value - An array of numbers
|
|
35
|
-
* @returns The overridden `add` method is returning the result of calling the `add` method of the superclass
|
|
36
|
-
* (`super.add`) with the joined string representation of the `value` array (`value.join(this._joint)`).
|
|
37
|
-
*/
|
|
38
|
-
override add(value: number[]) {
|
|
39
|
-
return super.add(value.join(this._joint));
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* The function overrides the delete method and deletes an element from a Set by joining the elements of the input
|
|
44
|
-
* array with a specified joint and then calling the delete method of the parent class.
|
|
45
|
-
* @param {number[]} value - An array of numbers
|
|
46
|
-
* @returns The `delete` method is returning the result of calling the `delete` method of the superclass, with the
|
|
47
|
-
* `value` array joined together using the `_joint` property.
|
|
48
|
-
*/
|
|
49
|
-
override delete(value: number[]) {
|
|
50
|
-
return super.delete(value.join(this._joint));
|
|
51
|
-
}
|
|
52
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|