typescript-ds-lib 0.1.1 → 0.1.3

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 CHANGED
@@ -3,7 +3,9 @@
3
3
 
4
4
  Native TypeScript data structure implementations without external dependencies.
5
5
 
6
- - Fast, Light and Tested
6
+ 1. Fast
7
+ 2. Native & Light
8
+ 3. Fully Tested
7
9
 
8
10
  ## Install
9
11
  ```
@@ -21,7 +23,8 @@ stack.push(2);
21
23
  stack.push(3);
22
24
 
23
25
  console.log(stack.top()); // 3
24
- console.log(stack.pop()); // 3
26
+ stack.pop();
27
+ console.log(stack.top()); // 2
25
28
  console.log(stack.size()); // 2
26
29
  ```
27
30
 
@@ -31,8 +34,11 @@ console.log(stack.size()); // 2
31
34
  - Priority Queue
32
35
  - Linked List
33
36
  - Binary Search Tree
37
+ - Red-Black Tree
34
38
  - Deque
35
39
  - Set
40
+ - Map
41
+ - Hash Table
36
42
 
37
43
 
38
44
  ## Contributions
package/dist/index.d.ts CHANGED
@@ -6,3 +6,6 @@ export { BinarySearchTree } from './lib/binary-search-tree';
6
6
  export { Deque } from './lib/deque';
7
7
  export { LinkedList } from './lib/linked-list';
8
8
  export { Set } from './lib/set';
9
+ export { Map } from './lib/map';
10
+ export { RedBlackTree } from './lib/red-black-tree';
11
+ export { HashTable } from './lib/hash-table';
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@ 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
- exports.Set = exports.LinkedList = exports.Deque = exports.BinarySearchTree = exports.PriorityQueue = exports.Queue = exports.Stack = void 0;
17
+ exports.HashTable = exports.RedBlackTree = exports.Map = exports.Set = exports.LinkedList = exports.Deque = exports.BinarySearchTree = exports.PriorityQueue = exports.Queue = exports.Stack = void 0;
18
18
  __exportStar(require("./types"), exports);
19
19
  var stack_1 = require("./lib/stack");
20
20
  Object.defineProperty(exports, "Stack", { enumerable: true, get: function () { return stack_1.Stack; } });
@@ -30,4 +30,10 @@ var linked_list_1 = require("./lib/linked-list");
30
30
  Object.defineProperty(exports, "LinkedList", { enumerable: true, get: function () { return linked_list_1.LinkedList; } });
31
31
  var set_1 = require("./lib/set");
32
32
  Object.defineProperty(exports, "Set", { enumerable: true, get: function () { return set_1.Set; } });
33
+ var map_1 = require("./lib/map");
34
+ Object.defineProperty(exports, "Map", { enumerable: true, get: function () { return map_1.Map; } });
35
+ var red_black_tree_1 = require("./lib/red-black-tree");
36
+ Object.defineProperty(exports, "RedBlackTree", { enumerable: true, get: function () { return red_black_tree_1.RedBlackTree; } });
37
+ var hash_table_1 = require("./lib/hash-table");
38
+ Object.defineProperty(exports, "HashTable", { enumerable: true, get: function () { return hash_table_1.HashTable; } });
33
39
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,qCAAoC;AAA3B,8FAAA,KAAK,OAAA;AACd,qCAAoC;AAA3B,8FAAA,KAAK,OAAA;AACd,uDAAqD;AAA5C,+GAAA,aAAa,OAAA;AACtB,+DAA4D;AAAnD,sHAAA,gBAAgB,OAAA;AACzB,qCAAoC;AAA3B,8FAAA,KAAK,OAAA;AACd,iDAA+C;AAAtC,yGAAA,UAAU,OAAA;AACnB,iCAAgC;AAAvB,0FAAA,GAAG,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,qCAAoC;AAA3B,8FAAA,KAAK,OAAA;AACd,qCAAoC;AAA3B,8FAAA,KAAK,OAAA;AACd,uDAAqD;AAA5C,+GAAA,aAAa,OAAA;AACtB,+DAA4D;AAAnD,sHAAA,gBAAgB,OAAA;AACzB,qCAAoC;AAA3B,8FAAA,KAAK,OAAA;AACd,iDAA+C;AAAtC,yGAAA,UAAU,OAAA;AACnB,iCAAgC;AAAvB,0FAAA,GAAG,OAAA;AACZ,iCAAgC;AAAvB,0FAAA,GAAG,OAAA;AACZ,uDAAoD;AAA3C,8GAAA,YAAY,OAAA;AACrB,+CAA6C;AAApC,uGAAA,SAAS,OAAA"}
@@ -0,0 +1,15 @@
1
+ import { HashTableTy } from '../types';
2
+ export declare class HashTable<K, V> implements HashTableTy<K, V> {
3
+ private table;
4
+ private count;
5
+ private readonly capacity;
6
+ constructor(capacity?: number);
7
+ private hash;
8
+ insert(key: K, value: V): void;
9
+ get(key: K): V | undefined;
10
+ remove(key: K): boolean;
11
+ private keysEqual;
12
+ size(): number;
13
+ empty(): boolean;
14
+ clear(): void;
15
+ }
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HashTable = void 0;
4
+ class HashNode {
5
+ key;
6
+ value;
7
+ next;
8
+ constructor(key, value) {
9
+ this.key = key;
10
+ this.value = value;
11
+ this.next = null;
12
+ }
13
+ }
14
+ class HashTable {
15
+ table;
16
+ count;
17
+ capacity;
18
+ constructor(capacity = 16) {
19
+ this.table = new Array(capacity).fill(null);
20
+ this.count = 0;
21
+ this.capacity = capacity;
22
+ }
23
+ hash(key) {
24
+ let stringKey;
25
+ if (key === null || key === undefined) {
26
+ stringKey = 'null';
27
+ }
28
+ else if (typeof key === 'object') {
29
+ if (key instanceof Date) {
30
+ stringKey = key.getTime().toString();
31
+ }
32
+ else if (key instanceof RegExp) {
33
+ stringKey = key.toString();
34
+ }
35
+ stringKey = JSON.stringify(key);
36
+ }
37
+ else if (typeof key === 'symbol') {
38
+ stringKey = key.toString();
39
+ }
40
+ else if (typeof key === 'function') {
41
+ stringKey = key.toString();
42
+ }
43
+ else {
44
+ stringKey = String(key);
45
+ }
46
+ let hash = 0;
47
+ // DJB2 hash algorithm
48
+ for (let i = 0; i < stringKey.length; i++) {
49
+ hash = ((hash << 5) + hash) + stringKey.charCodeAt(i);
50
+ hash = hash >>> 0; // Convert to 32-bit unsigned integer
51
+ }
52
+ return hash % this.capacity;
53
+ }
54
+ insert(key, value) {
55
+ const index = this.hash(key);
56
+ const newNode = new HashNode(key, value);
57
+ if (!this.table[index]) {
58
+ this.table[index] = newNode;
59
+ this.count++;
60
+ return;
61
+ }
62
+ let current = this.table[index];
63
+ while (current) {
64
+ if (this.keysEqual(current.key, key)) {
65
+ current.value = value;
66
+ return;
67
+ }
68
+ if (!current.next) {
69
+ current.next = newNode;
70
+ this.count++;
71
+ return;
72
+ }
73
+ current = current.next;
74
+ }
75
+ }
76
+ get(key) {
77
+ const index = this.hash(key);
78
+ let current = this.table[index];
79
+ while (current) {
80
+ if (this.keysEqual(current.key, key)) {
81
+ return current.value;
82
+ }
83
+ current = current.next;
84
+ }
85
+ return undefined;
86
+ }
87
+ remove(key) {
88
+ const index = this.hash(key);
89
+ let current = this.table[index];
90
+ let prev = null;
91
+ while (current) {
92
+ if (this.keysEqual(current.key, key)) {
93
+ if (prev) {
94
+ prev.next = current.next;
95
+ }
96
+ else {
97
+ this.table[index] = current.next;
98
+ }
99
+ this.count--;
100
+ return true;
101
+ }
102
+ prev = current;
103
+ current = current.next;
104
+ }
105
+ return false;
106
+ }
107
+ keysEqual(key1, key2) {
108
+ if (key1 === key2)
109
+ return true;
110
+ if (key1 == null || key2 == null)
111
+ return false;
112
+ if (typeof key1 !== 'object' && typeof key2 !== 'object') {
113
+ return key1 === key2;
114
+ }
115
+ if (key1 instanceof Date && key2 instanceof Date) {
116
+ return key1.getTime() === key2.getTime();
117
+ }
118
+ if (key1 instanceof RegExp && key2 instanceof RegExp) {
119
+ return key1.toString() === key2.toString();
120
+ }
121
+ if (Array.isArray(key1) && Array.isArray(key2)) {
122
+ return key1.length === key2.length &&
123
+ key1.every((val, idx) => this.keysEqual(val, key2[idx]));
124
+ }
125
+ if (typeof key1 === 'object' && typeof key2 === 'object') {
126
+ const keys1 = Object.keys(key1);
127
+ const keys2 = Object.keys(key2);
128
+ return keys1.length === keys2.length &&
129
+ keys1.every(k => k in key2 && this.keysEqual(key1[k], key2[k]));
130
+ }
131
+ return false;
132
+ }
133
+ size() {
134
+ return this.count;
135
+ }
136
+ empty() {
137
+ return this.count === 0;
138
+ }
139
+ clear() {
140
+ this.table = new Array(this.capacity).fill(null);
141
+ this.count = 0;
142
+ }
143
+ }
144
+ exports.HashTable = HashTable;
145
+ //# sourceMappingURL=hash-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash-table.js","sourceRoot":"","sources":["../../lib/hash-table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { MapTy } from '../types';
2
+ export declare class Map<K, V> implements MapTy<K, V> {
3
+ private rbTree;
4
+ constructor();
5
+ insert(key: K, value: V): void;
6
+ find(key: K): V | undefined;
7
+ delete(key: K): void;
8
+ clear(): void;
9
+ size(): number;
10
+ empty(): boolean;
11
+ }
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Map = void 0;
4
+ const red_black_tree_1 = require("./red-black-tree");
5
+ class Map {
6
+ rbTree;
7
+ constructor() {
8
+ this.rbTree = new red_black_tree_1.RedBlackTree();
9
+ }
10
+ insert(key, value) {
11
+ this.rbTree.insert(key, value);
12
+ }
13
+ find(key) {
14
+ return this.rbTree.find(key);
15
+ }
16
+ delete(key) {
17
+ this.rbTree.remove(key);
18
+ }
19
+ clear() {
20
+ this.rbTree.clear();
21
+ }
22
+ size() {
23
+ return this.rbTree.size();
24
+ }
25
+ empty() {
26
+ return this.rbTree.empty();
27
+ }
28
+ }
29
+ exports.Map = Map;
30
+ //# sourceMappingURL=map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map.js","sourceRoot":"","sources":["../../lib/map.ts"],"names":[],"mappings":";;;AACA,qDAAgD;AAGhD,MAAa,GAAG;IACN,MAAM,CAAqB;IAEnC;QACE,IAAI,CAAC,MAAM,GAAG,IAAI,6BAAY,EAAQ,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,GAAM,EAAE,KAAQ;QACrB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,CAAC,GAAM;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,GAAM;QACX,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;CACF;AA9BD,kBA8BC"}
@@ -0,0 +1,23 @@
1
+ import { RedBlackTreeTy } from '../types';
2
+ export declare class RedBlackTree<K, V> implements RedBlackTreeTy<K, V> {
3
+ private root;
4
+ private nodeCount;
5
+ constructor();
6
+ private rotateLeft;
7
+ private rotateRight;
8
+ private fixInsert;
9
+ insert(key: K, value: V): void;
10
+ private findNode;
11
+ find(key: K): V | undefined;
12
+ private findMinNode;
13
+ min(): V | undefined;
14
+ private findMaxNode;
15
+ max(): V | undefined;
16
+ remove(key: K): void;
17
+ private deleteNode;
18
+ private transplant;
19
+ private fixDelete;
20
+ empty(): boolean;
21
+ size(): number;
22
+ clear(): void;
23
+ }
@@ -0,0 +1,310 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RedBlackTree = void 0;
4
+ var Color;
5
+ (function (Color) {
6
+ Color[Color["RED"] = 0] = "RED";
7
+ Color[Color["BLACK"] = 1] = "BLACK";
8
+ })(Color || (Color = {}));
9
+ class RBNode {
10
+ key;
11
+ value;
12
+ color;
13
+ left;
14
+ right;
15
+ parent;
16
+ constructor(key, value) {
17
+ this.key = key;
18
+ this.value = value;
19
+ this.color = Color.RED;
20
+ this.left = null;
21
+ this.right = null;
22
+ this.parent = null;
23
+ }
24
+ }
25
+ class RedBlackTree {
26
+ root;
27
+ nodeCount;
28
+ constructor() {
29
+ this.root = null;
30
+ this.nodeCount = 0;
31
+ }
32
+ rotateLeft(node) {
33
+ const rightChild = node.right;
34
+ node.right = rightChild.left;
35
+ if (rightChild.left !== null) {
36
+ rightChild.left.parent = node;
37
+ }
38
+ rightChild.parent = node.parent;
39
+ if (node.parent === null) {
40
+ this.root = rightChild;
41
+ }
42
+ else if (node === node.parent.left) {
43
+ node.parent.left = rightChild;
44
+ }
45
+ else {
46
+ node.parent.right = rightChild;
47
+ }
48
+ rightChild.left = node;
49
+ node.parent = rightChild;
50
+ }
51
+ rotateRight(node) {
52
+ const leftChild = node.left;
53
+ node.left = leftChild.right;
54
+ if (leftChild.right !== null) {
55
+ leftChild.right.parent = node;
56
+ }
57
+ leftChild.parent = node.parent;
58
+ if (node.parent === null) {
59
+ this.root = leftChild;
60
+ }
61
+ else if (node === node.parent.right) {
62
+ node.parent.right = leftChild;
63
+ }
64
+ else {
65
+ node.parent.left = leftChild;
66
+ }
67
+ leftChild.right = node;
68
+ node.parent = leftChild;
69
+ }
70
+ fixInsert(node) {
71
+ while (node !== this.root && node.parent?.color === Color.RED) {
72
+ if (node.parent === node.parent.parent?.left) {
73
+ const uncle = node.parent.parent.right;
74
+ if (uncle?.color === Color.RED) {
75
+ node.parent.color = Color.BLACK;
76
+ uncle.color = Color.BLACK;
77
+ node.parent.parent.color = Color.RED;
78
+ node = node.parent.parent;
79
+ }
80
+ else {
81
+ if (node === node.parent.right) {
82
+ node = node.parent;
83
+ this.rotateLeft(node);
84
+ }
85
+ node.parent.color = Color.BLACK;
86
+ node.parent.parent.color = Color.RED;
87
+ this.rotateRight(node.parent.parent);
88
+ }
89
+ }
90
+ else {
91
+ const uncle = node.parent.parent?.left;
92
+ if (uncle?.color === Color.RED) {
93
+ node.parent.color = Color.BLACK;
94
+ uncle.color = Color.BLACK;
95
+ node.parent.parent.color = Color.RED;
96
+ node = node.parent.parent;
97
+ }
98
+ else {
99
+ if (node === node.parent.left) {
100
+ node = node.parent;
101
+ this.rotateRight(node);
102
+ }
103
+ node.parent.color = Color.BLACK;
104
+ node.parent.parent.color = Color.RED;
105
+ this.rotateLeft(node.parent.parent);
106
+ }
107
+ }
108
+ }
109
+ this.root.color = Color.BLACK;
110
+ }
111
+ insert(key, value) {
112
+ const newNode = new RBNode(key, value);
113
+ let parent = null;
114
+ let current = this.root;
115
+ while (current !== null) {
116
+ parent = current;
117
+ if (key < current.key) {
118
+ current = current.left;
119
+ }
120
+ else if (key > current.key) {
121
+ current = current.right;
122
+ }
123
+ else {
124
+ // Key already exists, update value
125
+ current.value = value;
126
+ return;
127
+ }
128
+ }
129
+ newNode.parent = parent;
130
+ if (parent === null) {
131
+ this.root = newNode;
132
+ }
133
+ else if (key < parent.key) {
134
+ parent.left = newNode;
135
+ }
136
+ else {
137
+ parent.right = newNode;
138
+ }
139
+ this.nodeCount++;
140
+ this.fixInsert(newNode);
141
+ }
142
+ findNode(key) {
143
+ let current = this.root;
144
+ while (current !== null) {
145
+ if (key === current.key) {
146
+ return current;
147
+ }
148
+ current = key < current.key ? current.left : current.right;
149
+ }
150
+ return null;
151
+ }
152
+ find(key) {
153
+ const node = this.findNode(key);
154
+ return node ? node.value : undefined;
155
+ }
156
+ findMinNode(node) {
157
+ let current = node;
158
+ while (current.left !== null) {
159
+ current = current.left;
160
+ }
161
+ return current;
162
+ }
163
+ min() {
164
+ if (!this.root)
165
+ return undefined;
166
+ return this.findMinNode(this.root).value;
167
+ }
168
+ findMaxNode(node) {
169
+ let current = node;
170
+ while (current.right !== null) {
171
+ current = current.right;
172
+ }
173
+ return current;
174
+ }
175
+ max() {
176
+ if (!this.root)
177
+ return undefined;
178
+ return this.findMaxNode(this.root).value;
179
+ }
180
+ remove(key) {
181
+ const node = this.findNode(key);
182
+ if (node) {
183
+ this.nodeCount--;
184
+ this.deleteNode(node);
185
+ }
186
+ }
187
+ deleteNode(node) {
188
+ let x;
189
+ let y = node;
190
+ let originalColor = y.color;
191
+ if (node.left === null) {
192
+ x = node.right;
193
+ this.transplant(node, node.right);
194
+ }
195
+ else if (node.right === null) {
196
+ x = node.left;
197
+ this.transplant(node, node.left);
198
+ }
199
+ else {
200
+ y = this.findMinNode(node.right);
201
+ originalColor = y.color;
202
+ x = y.right;
203
+ if (y.parent === node) {
204
+ if (x)
205
+ x.parent = y;
206
+ }
207
+ else {
208
+ this.transplant(y, y.right);
209
+ y.right = node.right;
210
+ y.right.parent = y;
211
+ }
212
+ this.transplant(node, y);
213
+ y.left = node.left;
214
+ y.left.parent = y;
215
+ y.color = node.color;
216
+ }
217
+ if (originalColor === Color.BLACK && x) {
218
+ this.fixDelete(x);
219
+ }
220
+ }
221
+ transplant(u, v) {
222
+ if (u.parent === null) {
223
+ this.root = v;
224
+ }
225
+ else if (u === u.parent.left) {
226
+ u.parent.left = v;
227
+ }
228
+ else {
229
+ u.parent.right = v;
230
+ }
231
+ if (v !== null) {
232
+ v.parent = u.parent;
233
+ }
234
+ }
235
+ fixDelete(x) {
236
+ while (x !== this.root && x.color === Color.BLACK) {
237
+ if (x === x.parent.left) {
238
+ let w = x.parent.right;
239
+ if (w.color === Color.RED) {
240
+ w.color = Color.BLACK;
241
+ x.parent.color = Color.RED;
242
+ this.rotateLeft(x.parent);
243
+ w = x.parent.right;
244
+ }
245
+ if ((!w.left || w.left.color === Color.BLACK) &&
246
+ (!w.right || w.right.color === Color.BLACK)) {
247
+ w.color = Color.RED;
248
+ x = x.parent;
249
+ }
250
+ else {
251
+ if (!w.right || w.right.color === Color.BLACK) {
252
+ if (w.left)
253
+ w.left.color = Color.BLACK;
254
+ w.color = Color.RED;
255
+ this.rotateRight(w);
256
+ w = x.parent.right;
257
+ }
258
+ w.color = x.parent.color;
259
+ x.parent.color = Color.BLACK;
260
+ if (w.right)
261
+ w.right.color = Color.BLACK;
262
+ this.rotateLeft(x.parent);
263
+ x = this.root;
264
+ }
265
+ }
266
+ else {
267
+ let w = x.parent.left;
268
+ if (w.color === Color.RED) {
269
+ w.color = Color.BLACK;
270
+ x.parent.color = Color.RED;
271
+ this.rotateRight(x.parent);
272
+ w = x.parent.left;
273
+ }
274
+ if ((!w.right || w.right.color === Color.BLACK) &&
275
+ (!w.left || w.left.color === Color.BLACK)) {
276
+ w.color = Color.RED;
277
+ x = x.parent;
278
+ }
279
+ else {
280
+ if (!w.left || w.left.color === Color.BLACK) {
281
+ if (w.right)
282
+ w.right.color = Color.BLACK;
283
+ w.color = Color.RED;
284
+ this.rotateLeft(w);
285
+ w = x.parent.left;
286
+ }
287
+ w.color = x.parent.color;
288
+ x.parent.color = Color.BLACK;
289
+ if (w.left)
290
+ w.left.color = Color.BLACK;
291
+ this.rotateRight(x.parent);
292
+ x = this.root;
293
+ }
294
+ }
295
+ }
296
+ x.color = Color.BLACK;
297
+ }
298
+ empty() {
299
+ return this.root === null;
300
+ }
301
+ size() {
302
+ return this.nodeCount;
303
+ }
304
+ clear() {
305
+ this.root = null;
306
+ this.nodeCount = 0;
307
+ }
308
+ }
309
+ exports.RedBlackTree = RedBlackTree;
310
+ //# sourceMappingURL=red-black-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"red-black-tree.js","sourceRoot":"","sources":["../../lib/red-black-tree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const hash_table_1 = require("../lib/hash-table");
4
+ describe('HashTable', () => {
5
+ let hashTable;
6
+ beforeEach(() => {
7
+ hashTable = new hash_table_1.HashTable();
8
+ });
9
+ test('should start empty', () => {
10
+ expect(hashTable.empty()).toBe(true);
11
+ expect(hashTable.size()).toBe(0);
12
+ });
13
+ test('should insert and retrieve values', () => {
14
+ hashTable.insert('one', 1);
15
+ hashTable.insert('two', 2);
16
+ hashTable.insert('three', 3);
17
+ expect(hashTable.get('one')).toBe(1);
18
+ expect(hashTable.get('two')).toBe(2);
19
+ expect(hashTable.get('three')).toBe(3);
20
+ expect(hashTable.size()).toBe(3);
21
+ });
22
+ test('should handle collisions', () => {
23
+ // Force collisions by using a small capacity
24
+ const smallTable = new hash_table_1.HashTable(2);
25
+ smallTable.insert('a', 1);
26
+ smallTable.insert('b', 2);
27
+ smallTable.insert('c', 3);
28
+ smallTable.insert('d', 4);
29
+ expect(smallTable.get('a')).toBe(1);
30
+ expect(smallTable.get('b')).toBe(2);
31
+ expect(smallTable.get('c')).toBe(3);
32
+ expect(smallTable.get('d')).toBe(4);
33
+ });
34
+ test('should update existing keys', () => {
35
+ hashTable.insert('key', 1);
36
+ expect(hashTable.get('key')).toBe(1);
37
+ hashTable.insert('key', 2);
38
+ expect(hashTable.get('key')).toBe(2);
39
+ expect(hashTable.size()).toBe(1);
40
+ });
41
+ test('should remove elements', () => {
42
+ hashTable.insert('one', 1);
43
+ hashTable.insert('two', 2);
44
+ expect(hashTable.remove('one')).toBe(true);
45
+ expect(hashTable.get('one')).toBeUndefined();
46
+ expect(hashTable.size()).toBe(1);
47
+ expect(hashTable.remove('nonexistent')).toBe(false);
48
+ });
49
+ test('should clear the table', () => {
50
+ hashTable.insert('one', 1);
51
+ hashTable.insert('two', 2);
52
+ hashTable.insert('three', 3);
53
+ hashTable.clear();
54
+ expect(hashTable.empty()).toBe(true);
55
+ expect(hashTable.size()).toBe(0);
56
+ expect(hashTable.get('one')).toBeUndefined();
57
+ });
58
+ test('should handle different key types', () => {
59
+ const mixedTable = new hash_table_1.HashTable();
60
+ mixedTable.insert(42, 'number');
61
+ mixedTable.insert(true, 'boolean');
62
+ mixedTable.insert({ id: 1 }, 'object');
63
+ mixedTable.insert([1, 2, 3], 'array');
64
+ expect(mixedTable.get(42)).toBe('number');
65
+ expect(mixedTable.get(true)).toBe('boolean');
66
+ expect(mixedTable.get({ id: 1 })).toBe('object');
67
+ expect(mixedTable.get([1, 2, 3])).toBe('array');
68
+ });
69
+ });
70
+ //# sourceMappingURL=hash-table.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash-table.test.js","sourceRoot":"","sources":["../../tests/hash-table.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const map_1 = require("../lib/map");
4
+ describe('Map', () => {
5
+ let map;
6
+ beforeEach(() => {
7
+ map = new map_1.Map();
8
+ });
9
+ test('should start empty', () => {
10
+ expect(map.empty()).toBe(true);
11
+ expect(map.size()).toBe(0);
12
+ });
13
+ test('should insert and find key-value pairs correctly', () => {
14
+ map.insert('one', 1);
15
+ map.insert('two', 2);
16
+ map.insert('three', 3);
17
+ expect(map.empty()).toBe(false);
18
+ expect(map.size()).toBe(3);
19
+ expect(map.find('one')).toBe(1);
20
+ expect(map.find('two')).toBe(2);
21
+ expect(map.find('three')).toBe(3);
22
+ expect(map.find('four')).toBeUndefined();
23
+ });
24
+ test('should handle duplicate keys by updating values', () => {
25
+ map.insert('test', 1);
26
+ map.insert('test', 2);
27
+ map.insert('test', 3);
28
+ expect(map.size()).toBe(1);
29
+ expect(map.find('test')).toBe(3);
30
+ });
31
+ test('should delete key-value pairs correctly', () => {
32
+ map.insert('one', 1);
33
+ map.insert('two', 2);
34
+ map.insert('three', 3);
35
+ expect(map.size()).toBe(3);
36
+ map.delete('two');
37
+ expect(map.find('two')).toBeUndefined();
38
+ expect(map.size()).toBe(2);
39
+ map.delete('one');
40
+ expect(map.find('one')).toBeUndefined();
41
+ expect(map.size()).toBe(1);
42
+ });
43
+ test('should handle deleting non-existent keys', () => {
44
+ map.insert('one', 1);
45
+ map.insert('two', 2);
46
+ const initialSize = map.size();
47
+ map.delete('three');
48
+ expect(map.size()).toBe(initialSize);
49
+ });
50
+ test('should clear all entries', () => {
51
+ map.insert('one', 1);
52
+ map.insert('two', 2);
53
+ map.insert('three', 3);
54
+ expect(map.empty()).toBe(false);
55
+ map.clear();
56
+ expect(map.empty()).toBe(true);
57
+ expect(map.size()).toBe(0);
58
+ });
59
+ });
60
+ //# sourceMappingURL=map.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map.test.js","sourceRoot":"","sources":["../../tests/map.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const red_black_tree_1 = require("../lib/red-black-tree");
4
+ describe('RedBlackTree', () => {
5
+ let tree;
6
+ beforeEach(() => {
7
+ tree = new red_black_tree_1.RedBlackTree();
8
+ });
9
+ test('should start empty', () => {
10
+ expect(tree.empty()).toBe(true);
11
+ expect(tree.size()).toBe(0);
12
+ });
13
+ test('should insert values correctly', () => {
14
+ tree.insert(5, 5);
15
+ tree.insert(3, 3);
16
+ tree.insert(7, 7);
17
+ expect(tree.empty()).toBe(false);
18
+ expect(tree.size()).toBe(3);
19
+ expect(tree.find(5)).toBe(5);
20
+ expect(tree.find(3)).toBe(3);
21
+ expect(tree.find(7)).toBe(7);
22
+ expect(tree.find(1)).toBeUndefined();
23
+ });
24
+ test('should handle duplicate inserts', () => {
25
+ tree.insert(5, 1);
26
+ tree.insert(5, 2);
27
+ tree.insert(5, 3);
28
+ expect(tree.size()).toBe(1);
29
+ expect(tree.find(5)).toBe(3);
30
+ });
31
+ test('should remove values correctly', () => {
32
+ tree.insert(5, 5);
33
+ tree.insert(3, 3);
34
+ tree.insert(7, 7);
35
+ tree.insert(1, 1);
36
+ tree.insert(9, 9);
37
+ expect(tree.size()).toBe(5);
38
+ tree.remove(3);
39
+ expect(tree.find(3)).toBeUndefined();
40
+ expect(tree.size()).toBe(4);
41
+ tree.remove(5);
42
+ expect(tree.find(5)).toBeUndefined();
43
+ expect(tree.size()).toBe(3);
44
+ });
45
+ test('should handle removing non-existent values', () => {
46
+ tree.insert(5, 5);
47
+ tree.insert(3, 3);
48
+ const initialSize = tree.size();
49
+ tree.remove(7);
50
+ expect(tree.size()).toBe(initialSize);
51
+ });
52
+ test('should clear all nodes', () => {
53
+ tree.insert(5, 5);
54
+ tree.insert(3, 3);
55
+ tree.insert(7, 7);
56
+ expect(tree.empty()).toBe(false);
57
+ tree.clear();
58
+ expect(tree.empty()).toBe(true);
59
+ expect(tree.size()).toBe(0);
60
+ });
61
+ test('should maintain correct size after operations', () => {
62
+ expect(tree.size()).toBe(0);
63
+ tree.insert(1, 1);
64
+ expect(tree.size()).toBe(1);
65
+ tree.insert(2, 2);
66
+ tree.insert(3, 3);
67
+ expect(tree.size()).toBe(3);
68
+ tree.remove(2);
69
+ expect(tree.size()).toBe(2);
70
+ tree.clear();
71
+ expect(tree.size()).toBe(0);
72
+ });
73
+ });
74
+ //# sourceMappingURL=red-black-tree.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"red-black-tree.test.js","sourceRoot":"","sources":["../../tests/red-black-tree.test.ts"],"names":[],"mappings":"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"}
@@ -62,3 +62,29 @@ export interface SetTy<T> {
62
62
  size(): number;
63
63
  clear(): void;
64
64
  }
65
+ export interface MapTy<K, V> {
66
+ insert(key: K, value: V): void;
67
+ find(key: K): V | undefined;
68
+ delete(key: K): void;
69
+ clear(): void;
70
+ empty(): boolean;
71
+ size(): number;
72
+ }
73
+ export interface RedBlackTreeTy<K, V> {
74
+ insert(key: K, value: V): void;
75
+ remove(key: K): void;
76
+ find(key: K): V | undefined;
77
+ min(): V | undefined;
78
+ max(): V | undefined;
79
+ empty(): boolean;
80
+ size(): number;
81
+ clear(): void;
82
+ }
83
+ export interface HashTableTy<K, V> {
84
+ insert(key: K, value: V): void;
85
+ get(key: K): V | undefined;
86
+ remove(key: K): boolean;
87
+ size(): number;
88
+ empty(): boolean;
89
+ clear(): void;
90
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "typescript-ds-lib",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "A collection of TypeScript data structure implementations",
5
5
  "author": "Artiom Baloian <artiom.baloian@gmail.com>",
6
6
  "license": "MIT",