data-structure-typed 1.50.1 → 1.50.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.
Files changed (196) hide show
  1. package/CHANGELOG.md +2 -1
  2. package/README.md +30 -28
  3. package/README_zh-CN.md +1 -1
  4. package/SPECIFICATION.md +56 -0
  5. package/SPONSOR-zh-CN.md +90 -0
  6. package/SPONSOR.md +54 -0
  7. package/benchmark/report.html +13 -13
  8. package/benchmark/report.json +149 -161
  9. package/dist/cjs/data-structures/base/iterable-base.d.ts +120 -9
  10. package/dist/cjs/data-structures/base/iterable-base.js +143 -7
  11. package/dist/cjs/data-structures/base/iterable-base.js.map +1 -1
  12. package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +72 -47
  13. package/dist/cjs/data-structures/binary-tree/avl-tree.js +101 -72
  14. package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
  15. package/dist/cjs/data-structures/binary-tree/binary-indexed-tree.d.ts +22 -0
  16. package/dist/cjs/data-structures/binary-tree/binary-indexed-tree.js +22 -0
  17. package/dist/cjs/data-structures/binary-tree/binary-indexed-tree.js.map +1 -1
  18. package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +244 -199
  19. package/dist/cjs/data-structures/binary-tree/binary-tree.js +484 -376
  20. package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  21. package/dist/cjs/data-structures/binary-tree/bst.d.ts +92 -79
  22. package/dist/cjs/data-structures/binary-tree/bst.js +68 -76
  23. package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
  24. package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +127 -57
  25. package/dist/cjs/data-structures/binary-tree/rb-tree.js +152 -99
  26. package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
  27. package/dist/cjs/data-structures/binary-tree/segment-tree.d.ts +99 -6
  28. package/dist/cjs/data-structures/binary-tree/segment-tree.js +127 -10
  29. package/dist/cjs/data-structures/binary-tree/segment-tree.js.map +1 -1
  30. package/dist/cjs/data-structures/binary-tree/tree-multimap.d.ts +72 -58
  31. package/dist/cjs/data-structures/binary-tree/tree-multimap.js +102 -85
  32. package/dist/cjs/data-structures/binary-tree/tree-multimap.js.map +1 -1
  33. package/dist/cjs/data-structures/graph/abstract-graph.d.ts +1 -78
  34. package/dist/cjs/data-structures/graph/abstract-graph.js +3 -189
  35. package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
  36. package/dist/cjs/data-structures/graph/directed-graph.d.ts +73 -0
  37. package/dist/cjs/data-structures/graph/directed-graph.js +131 -0
  38. package/dist/cjs/data-structures/graph/directed-graph.js.map +1 -1
  39. package/dist/cjs/data-structures/graph/map-graph.d.ts +8 -0
  40. package/dist/cjs/data-structures/graph/map-graph.js +14 -0
  41. package/dist/cjs/data-structures/graph/map-graph.js.map +1 -1
  42. package/dist/cjs/data-structures/graph/undirected-graph.d.ts +76 -7
  43. package/dist/cjs/data-structures/graph/undirected-graph.js +151 -18
  44. package/dist/cjs/data-structures/graph/undirected-graph.js.map +1 -1
  45. package/dist/cjs/data-structures/hash/hash-map.d.ts +254 -28
  46. package/dist/cjs/data-structures/hash/hash-map.js +347 -78
  47. package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
  48. package/dist/cjs/data-structures/heap/heap.d.ts +95 -25
  49. package/dist/cjs/data-structures/heap/heap.js +95 -26
  50. package/dist/cjs/data-structures/heap/heap.js.map +1 -1
  51. package/dist/cjs/data-structures/linked-list/doubly-linked-list.d.ts +126 -63
  52. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js +141 -77
  53. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js.map +1 -1
  54. package/dist/cjs/data-structures/linked-list/singly-linked-list.d.ts +154 -106
  55. package/dist/cjs/data-structures/linked-list/singly-linked-list.js +164 -115
  56. package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
  57. package/dist/cjs/data-structures/linked-list/skip-linked-list.d.ts +63 -36
  58. package/dist/cjs/data-structures/linked-list/skip-linked-list.js +63 -36
  59. package/dist/cjs/data-structures/linked-list/skip-linked-list.js.map +1 -1
  60. package/dist/cjs/data-structures/matrix/matrix.d.ts +35 -4
  61. package/dist/cjs/data-structures/matrix/matrix.js +50 -11
  62. package/dist/cjs/data-structures/matrix/matrix.js.map +1 -1
  63. package/dist/cjs/data-structures/priority-queue/max-priority-queue.d.ts +10 -0
  64. package/dist/cjs/data-structures/priority-queue/max-priority-queue.js +10 -0
  65. package/dist/cjs/data-structures/priority-queue/max-priority-queue.js.map +1 -1
  66. package/dist/cjs/data-structures/priority-queue/min-priority-queue.d.ts +11 -0
  67. package/dist/cjs/data-structures/priority-queue/min-priority-queue.js +11 -0
  68. package/dist/cjs/data-structures/priority-queue/min-priority-queue.js.map +1 -1
  69. package/dist/cjs/data-structures/priority-queue/priority-queue.d.ts +8 -0
  70. package/dist/cjs/data-structures/priority-queue/priority-queue.js +8 -0
  71. package/dist/cjs/data-structures/priority-queue/priority-queue.js.map +1 -1
  72. package/dist/cjs/data-structures/queue/deque.d.ts +139 -35
  73. package/dist/cjs/data-structures/queue/deque.js +200 -62
  74. package/dist/cjs/data-structures/queue/deque.js.map +1 -1
  75. package/dist/cjs/data-structures/queue/queue.d.ts +103 -49
  76. package/dist/cjs/data-structures/queue/queue.js +111 -49
  77. package/dist/cjs/data-structures/queue/queue.js.map +1 -1
  78. package/dist/cjs/data-structures/stack/stack.d.ts +51 -21
  79. package/dist/cjs/data-structures/stack/stack.js +58 -22
  80. package/dist/cjs/data-structures/stack/stack.js.map +1 -1
  81. package/dist/cjs/data-structures/tree/tree.d.ts +57 -3
  82. package/dist/cjs/data-structures/tree/tree.js +77 -11
  83. package/dist/cjs/data-structures/tree/tree.js.map +1 -1
  84. package/dist/cjs/data-structures/trie/trie.d.ts +135 -34
  85. package/dist/cjs/data-structures/trie/trie.js +153 -33
  86. package/dist/cjs/data-structures/trie/trie.js.map +1 -1
  87. package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +1 -1
  88. package/dist/cjs/types/data-structures/hash/hash-map.d.ts +4 -3
  89. package/dist/cjs/types/utils/utils.d.ts +1 -0
  90. package/dist/mjs/data-structures/base/iterable-base.d.ts +120 -9
  91. package/dist/mjs/data-structures/base/iterable-base.js +143 -7
  92. package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +72 -47
  93. package/dist/mjs/data-structures/binary-tree/avl-tree.js +102 -73
  94. package/dist/mjs/data-structures/binary-tree/binary-indexed-tree.d.ts +22 -0
  95. package/dist/mjs/data-structures/binary-tree/binary-indexed-tree.js +22 -0
  96. package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +244 -199
  97. package/dist/mjs/data-structures/binary-tree/binary-tree.js +483 -375
  98. package/dist/mjs/data-structures/binary-tree/bst.d.ts +92 -79
  99. package/dist/mjs/data-structures/binary-tree/bst.js +68 -76
  100. package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +127 -57
  101. package/dist/mjs/data-structures/binary-tree/rb-tree.js +153 -100
  102. package/dist/mjs/data-structures/binary-tree/segment-tree.d.ts +99 -6
  103. package/dist/mjs/data-structures/binary-tree/segment-tree.js +127 -10
  104. package/dist/mjs/data-structures/binary-tree/tree-multimap.d.ts +72 -58
  105. package/dist/mjs/data-structures/binary-tree/tree-multimap.js +102 -86
  106. package/dist/mjs/data-structures/graph/abstract-graph.d.ts +1 -78
  107. package/dist/mjs/data-structures/graph/abstract-graph.js +3 -188
  108. package/dist/mjs/data-structures/graph/directed-graph.d.ts +73 -0
  109. package/dist/mjs/data-structures/graph/directed-graph.js +131 -0
  110. package/dist/mjs/data-structures/graph/map-graph.d.ts +8 -0
  111. package/dist/mjs/data-structures/graph/map-graph.js +14 -0
  112. package/dist/mjs/data-structures/graph/undirected-graph.d.ts +76 -7
  113. package/dist/mjs/data-structures/graph/undirected-graph.js +152 -19
  114. package/dist/mjs/data-structures/hash/hash-map.d.ts +254 -28
  115. package/dist/mjs/data-structures/hash/hash-map.js +353 -84
  116. package/dist/mjs/data-structures/heap/heap.d.ts +95 -25
  117. package/dist/mjs/data-structures/heap/heap.js +95 -26
  118. package/dist/mjs/data-structures/linked-list/doubly-linked-list.d.ts +126 -63
  119. package/dist/mjs/data-structures/linked-list/doubly-linked-list.js +144 -80
  120. package/dist/mjs/data-structures/linked-list/singly-linked-list.d.ts +154 -106
  121. package/dist/mjs/data-structures/linked-list/singly-linked-list.js +166 -117
  122. package/dist/mjs/data-structures/linked-list/skip-linked-list.d.ts +63 -36
  123. package/dist/mjs/data-structures/linked-list/skip-linked-list.js +63 -36
  124. package/dist/mjs/data-structures/matrix/matrix.d.ts +35 -4
  125. package/dist/mjs/data-structures/matrix/matrix.js +50 -11
  126. package/dist/mjs/data-structures/priority-queue/max-priority-queue.d.ts +10 -0
  127. package/dist/mjs/data-structures/priority-queue/max-priority-queue.js +10 -0
  128. package/dist/mjs/data-structures/priority-queue/min-priority-queue.d.ts +11 -0
  129. package/dist/mjs/data-structures/priority-queue/min-priority-queue.js +11 -0
  130. package/dist/mjs/data-structures/priority-queue/priority-queue.d.ts +8 -0
  131. package/dist/mjs/data-structures/priority-queue/priority-queue.js +8 -0
  132. package/dist/mjs/data-structures/queue/deque.d.ts +139 -35
  133. package/dist/mjs/data-structures/queue/deque.js +205 -67
  134. package/dist/mjs/data-structures/queue/queue.d.ts +103 -49
  135. package/dist/mjs/data-structures/queue/queue.js +111 -49
  136. package/dist/mjs/data-structures/stack/stack.d.ts +51 -21
  137. package/dist/mjs/data-structures/stack/stack.js +58 -22
  138. package/dist/mjs/data-structures/tree/tree.d.ts +57 -3
  139. package/dist/mjs/data-structures/tree/tree.js +80 -14
  140. package/dist/mjs/data-structures/trie/trie.d.ts +135 -34
  141. package/dist/mjs/data-structures/trie/trie.js +156 -36
  142. package/dist/mjs/types/data-structures/binary-tree/binary-tree.d.ts +1 -1
  143. package/dist/mjs/types/data-structures/hash/hash-map.d.ts +4 -3
  144. package/dist/mjs/types/utils/utils.d.ts +1 -0
  145. package/dist/umd/data-structure-typed.js +3121 -1583
  146. package/dist/umd/data-structure-typed.min.js +3 -3
  147. package/dist/umd/data-structure-typed.min.js.map +1 -1
  148. package/package.json +61 -55
  149. package/src/data-structures/base/iterable-base.ts +184 -19
  150. package/src/data-structures/binary-tree/avl-tree.ts +134 -100
  151. package/src/data-structures/binary-tree/binary-indexed-tree.ts +22 -0
  152. package/src/data-structures/binary-tree/binary-tree.ts +674 -671
  153. package/src/data-structures/binary-tree/bst.ts +127 -136
  154. package/src/data-structures/binary-tree/rb-tree.ts +199 -166
  155. package/src/data-structures/binary-tree/segment-tree.ts +145 -11
  156. package/src/data-structures/binary-tree/tree-multimap.ts +138 -115
  157. package/src/data-structures/graph/abstract-graph.ts +4 -211
  158. package/src/data-structures/graph/directed-graph.ts +152 -0
  159. package/src/data-structures/graph/map-graph.ts +15 -0
  160. package/src/data-structures/graph/undirected-graph.ts +171 -19
  161. package/src/data-structures/hash/hash-map.ts +389 -96
  162. package/src/data-structures/heap/heap.ts +97 -26
  163. package/src/data-structures/linked-list/doubly-linked-list.ts +156 -83
  164. package/src/data-structures/linked-list/singly-linked-list.ts +174 -120
  165. package/src/data-structures/linked-list/skip-linked-list.ts +63 -37
  166. package/src/data-structures/matrix/matrix.ts +52 -12
  167. package/src/data-structures/priority-queue/max-priority-queue.ts +10 -0
  168. package/src/data-structures/priority-queue/min-priority-queue.ts +11 -0
  169. package/src/data-structures/priority-queue/priority-queue.ts +8 -0
  170. package/src/data-structures/queue/deque.ts +225 -70
  171. package/src/data-structures/queue/queue.ts +118 -49
  172. package/src/data-structures/stack/stack.ts +63 -23
  173. package/src/data-structures/tree/tree.ts +89 -15
  174. package/src/data-structures/trie/trie.ts +173 -38
  175. package/src/types/data-structures/binary-tree/binary-tree.ts +1 -1
  176. package/src/types/data-structures/hash/hash-map.ts +4 -3
  177. package/src/types/utils/utils.ts +2 -0
  178. package/test/performance/data-structures/graph/directed-graph.test.ts +4 -4
  179. package/test/performance/data-structures/queue/deque.test.ts +26 -25
  180. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +37 -0
  181. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +46 -17
  182. package/test/unit/data-structures/binary-tree/bst.test.ts +65 -1
  183. package/test/unit/data-structures/binary-tree/rb-tree.test.ts +38 -1
  184. package/test/unit/data-structures/binary-tree/tree-multimap.test.ts +37 -32
  185. package/test/unit/data-structures/graph/abstract-graph.test.ts +11 -0
  186. package/test/unit/data-structures/graph/directed-graph.test.ts +190 -5
  187. package/test/unit/data-structures/graph/undirected-graph.test.ts +263 -18
  188. package/test/unit/data-structures/hash/hash-map.test.ts +376 -353
  189. package/test/unit/data-structures/heap/heap.test.ts +18 -1
  190. package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +24 -5
  191. package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +20 -2
  192. package/test/unit/data-structures/linked-list/skip-list.test.ts +1 -1
  193. package/test/unit/data-structures/queue/deque.test.ts +65 -5
  194. package/test/unit/data-structures/queue/queue.test.ts +24 -5
  195. package/test/unit/data-structures/stack/stack.test.ts +17 -0
  196. package/test/unit/data-structures/trie/trie.test.ts +17 -0
@@ -1,7 +1,7 @@
1
1
  import { HashMap, LinkedHashMap } from '../../../../src';
2
2
  import { getRandomInt, getRandomIntArray } from '../../../utils';
3
3
 
4
- describe('HashMap Test1', () => {
4
+ describe('HashMap', () => {
5
5
  let hashMap: HashMap<string, number>;
6
6
 
7
7
  beforeEach(() => {
@@ -84,335 +84,256 @@ describe('HashMap Test1', () => {
84
84
  // Make sure they are stored separately.
85
85
  // expect(hashMap.table[0].length).toBe(2);
86
86
  });
87
- });
88
87
 
89
- describe('HashMap Test2', () => {
90
- let hashMap: HashMap;
88
+ it('should clone', () => {
89
+ hashMap = new HashMap<string, number>();
91
90
 
92
- beforeEach(() => {
93
- hashMap = new HashMap();
94
- });
91
+ hashMap.set('one', 1);
92
+ hashMap.set('two', 2);
93
+ for (let i = 3; i <= 100; i++) {
94
+ hashMap.set(i.toString(), i);
95
+ }
95
96
 
96
- it('should create an empty map', () => {
97
- expect(hashMap.size).toBe(0);
98
- });
97
+ expect(hashMap.get('one')).toBe(1);
98
+ expect(hashMap.get('two')).toBe(2);
99
+ expect(hashMap.get('86')).toBe(86);
100
+ expect(hashMap.size).toBe(100);
101
+ hashMap.delete('two');
102
+ expect(hashMap.size).toBe(99);
99
103
 
100
- it('should add a key-value pair', () => {
101
- hashMap.set('key1', 'value1');
102
- expect(hashMap.get('key1')).toBe('value1');
104
+ const cloned = hashMap.clone();
105
+ expect(cloned.get('one')).toBe(1);
106
+ expect(cloned.get('two')).toBe(undefined);
107
+ expect(cloned.get('86')).toBe(86);
108
+ expect(cloned.size).toBe(99);
103
109
  });
104
110
 
105
- it('should handle object keys correctly', () => {
106
- const keyObj = { id: 1 };
107
- hashMap.set(keyObj, 'objectValue');
108
- expect(hashMap.get(keyObj)).toBe('objectValue');
109
- });
111
+ describe('HashMap Test2', () => {
112
+ let hashMap: HashMap;
110
113
 
111
- test('Inheritability test', () => {
112
- class ExtendedHashMap<K, V> extends HashMap<K, V> {
113
- someOtherParam?: string;
114
+ beforeEach(() => {
115
+ hashMap = new HashMap();
116
+ });
114
117
 
115
- constructor(
116
- elements: Iterable<[K, V]> = [],
117
- options?: {
118
- hashFn?: (key: K) => string;
119
- someOtherParam: string;
120
- }
121
- ) {
122
- const { someOtherParam, ...restOptions } = options || {};
123
- super(elements, restOptions);
124
- this.someOtherParam = someOtherParam;
125
- }
126
- }
118
+ it('should create an empty map', () => {
119
+ expect(hashMap.size).toBe(0);
120
+ });
127
121
 
128
- const eHM = new ExtendedHashMap<string, number>([], { someOtherParam: 'someOtherParam' });
129
- eHM.set('one', 1);
130
- expect(eHM.get('one')).toBe(1);
131
- });
122
+ it('should add a key-value pair', () => {
123
+ hashMap.set('key1', 'value1');
124
+ expect(hashMap.get('key1')).toBe('value1');
125
+ });
132
126
 
133
- test('should raw elements toEntry', () => {
134
- const rawCollection = [
135
- { id: 1, name: 'item 1' },
136
- { id: 2, name: 'item 2' }
137
- ];
138
- const hm = new HashMap<number, string, { id: number; name: string }>(rawCollection, {
139
- toEntryFn: rawElement => [rawElement.id, rawElement.name]
127
+ it('should handle object keys correctly', () => {
128
+ const keyObj = { id: 1 };
129
+ hashMap.set(keyObj, 'objectValue');
130
+ expect(hashMap.get(keyObj)).toBe('objectValue');
140
131
  });
141
132
 
142
- expect(hm.has(1)).toBe(true);
143
- expect(hm.get(2)).toBe('item 2');
144
- expect(hm.size).toBe(2);
145
- });
133
+ test('Inheritability test', () => {
134
+ class ExtendedHashMap<K, V> extends HashMap<K, V> {
135
+ someOtherParam?: string;
136
+
137
+ constructor(
138
+ elements: Iterable<[K, V]> = [],
139
+ options?: {
140
+ hashFn?: (key: K) => string;
141
+ someOtherParam: string;
142
+ }
143
+ ) {
144
+ const { someOtherParam, ...restOptions } = options || {};
145
+ super(elements, restOptions);
146
+ this.someOtherParam = someOtherParam;
147
+ }
148
+ }
146
149
 
147
- it('should update the value for an existing key', () => {
148
- hashMap.set('key1', 'value1');
149
- hashMap.set('key1', 'newValue');
150
- expect(hashMap.get('key1')).toBe('newValue');
151
- });
150
+ const eHM = new ExtendedHashMap<string, number>([], { someOtherParam: 'someOtherParam' });
151
+ eHM.set('one', 1);
152
+ expect(eHM.get('one')).toBe(1);
153
+ });
152
154
 
153
- it('should return undefined for a non-existent key', () => {
154
- expect(hashMap.get('nonExistentKey')).toBeUndefined();
155
- });
155
+ test('should raw elements toEntry', () => {
156
+ const rawCollection = [
157
+ { id: 1, name: 'item 1' },
158
+ { id: 2, name: 'item 2' }
159
+ ];
160
+ const hm = new HashMap<number, string, { id: number; name: string }>(rawCollection, {
161
+ toEntryFn: rawElement => [rawElement.id, rawElement.name]
162
+ });
163
+
164
+ expect(hm.has(1)).toBe(true);
165
+ expect(hm.get(2)).toBe('item 2');
166
+ expect(hm.size).toBe(2);
167
+ });
156
168
 
157
- it('should remove a key-value pair', () => {
158
- hashMap.set('key1', 'value1');
159
- hashMap.delete('key1');
160
- expect(hashMap.get('key1')).toBeUndefined();
161
- });
169
+ it('should update the value for an existing key', () => {
170
+ hashMap.set('key1', 'value1');
171
+ hashMap.set('key1', 'newValue');
172
+ expect(hashMap.get('key1')).toBe('newValue');
173
+ });
162
174
 
163
- it('should clear the map', () => {
164
- hashMap.set('key1', 'value1');
165
- expect(hashMap.size).toBe(1);
175
+ it('should return undefined for a non-existent key', () => {
176
+ expect(hashMap.get('nonExistentKey')).toBeUndefined();
177
+ });
166
178
 
167
- hashMap.clear();
168
- expect(hashMap.size).toBe(0);
169
- });
179
+ it('should remove a key-value pair', () => {
180
+ hashMap.set('key1', 'value1');
181
+ hashMap.delete('key1');
182
+ expect(hashMap.get('key1')).toBeUndefined();
183
+ });
170
184
 
171
- it('should iterate over values', () => {
172
- hashMap.set('key1', 'value1');
173
- hashMap.set('key2', 'value2');
174
- const values = [];
175
- for (const value of hashMap) {
176
- values.push(value);
177
- }
178
- expect(values).toEqual([
179
- ['key1', 'value1'],
180
- ['key2', 'value2']
181
- ]);
182
- });
185
+ it('should clear the map', () => {
186
+ hashMap.set('key1', 'value1');
187
+ expect(hashMap.size).toBe(1);
183
188
 
184
- function compareHashMaps(hashMap: HashMap<unknown, unknown>, stdMap: Map<unknown, unknown>) {
185
- expect(hashMap.size).toEqual(stdMap.size);
186
- stdMap.forEach((value, key) => {
187
- expect(hashMap.get(key)).toEqual(value);
189
+ hashMap.clear();
190
+ expect(hashMap.size).toBe(0);
188
191
  });
189
- }
190
192
 
191
- const stdMap: Map<unknown, unknown> = new Map();
192
- const arr: number[] = getRandomIntArray(1000, 1, 10000);
193
-
194
- it('delete test', () => {
195
- for (const item of arr) {
196
- stdMap.set(item, item);
197
- hashMap.set(item, item);
198
- }
199
- for (const item of arr) {
200
- if (Math.random() > 0.6) {
201
- expect(hashMap.delete(item)).toEqual(stdMap.delete(item));
193
+ it('should iterate over values', () => {
194
+ hashMap.set('key1', 'value1');
195
+ hashMap.set('key2', 'value2');
196
+ const values = [];
197
+ for (const value of hashMap) {
198
+ values.push(value);
202
199
  }
203
- }
204
- compareHashMaps(hashMap, stdMap);
200
+ expect(values).toEqual([
201
+ ['key1', 'value1'],
202
+ ['key2', 'value2']
203
+ ]);
204
+ });
205
205
 
206
- for (let i = 0; i < 1000; ++i) {
207
- const random = getRandomInt(0, 100);
208
- expect(hashMap.delete(random)).toEqual(stdMap.delete(random));
206
+ function compareHashMaps(hashMap: HashMap<unknown, unknown>, stdMap: Map<unknown, unknown>) {
207
+ expect(hashMap.size).toEqual(stdMap.size);
208
+ stdMap.forEach((value, key) => {
209
+ expect(hashMap.get(key)).toEqual(value);
210
+ });
209
211
  }
210
- compareHashMaps(hashMap, stdMap);
211
- });
212
- });
213
212
 
214
- describe('HashMap for coordinate object keys', () => {
215
- const hashMap: HashMap<[number, number], number> = new HashMap();
216
- const codObjs: [number, number][] = [];
213
+ const stdMap: Map<unknown, unknown> = new Map();
214
+ const arr: number[] = getRandomIntArray(1000, 1, 10000);
217
215
 
218
- test('set elements in hash map', () => {
219
- for (let i = 0; i < 1000; i++) {
220
- const codObj: [number, number] = [getRandomInt(-10000, 10000), i];
221
- codObjs.push(codObj);
222
- hashMap.set(codObj, i);
223
- }
224
- });
225
-
226
- test('get elements in hash map', () => {
227
- for (let i = 0; i < 1000; i++) {
228
- const codObj = codObjs[i];
229
- if (codObj) {
230
- expect(hashMap.get(codObj)).toBe(i);
216
+ it('delete test', () => {
217
+ for (const item of arr) {
218
+ stdMap.set(item, item);
219
+ hashMap.set(item, item);
231
220
  }
232
- }
233
- });
234
-
235
- test('delete elements in hash map', () => {
236
- for (let i = 0; i < 1000; i++) {
237
- if (i === 500) expect(hashMap.size).toBe(500);
238
- const codObj = codObjs[i];
239
- if (codObj) hashMap.delete(codObj);
240
- }
241
- expect(hashMap.size).toBe(0);
242
- });
243
- });
244
-
245
- describe('HashMap setMany, keys, values', () => {
246
- const hm: HashMap<number, number> = new HashMap<number, number>();
247
-
248
- beforeEach(() => {
249
- hm.clear();
250
- hm.setMany([
251
- [2, 2],
252
- [3, 3],
253
- [4, 4],
254
- [5, 5]
255
- ]);
256
- hm.setMany([
257
- [2, 2],
258
- [3, 3],
259
- [4, 4],
260
- [6, 6]
261
- ]);
262
- });
263
-
264
- test('keys', () => {
265
- expect([...hm.keys()]).toEqual([2, 3, 4, 5, 6]);
266
- });
267
-
268
- test('values', () => {
269
- expect([...hm.values()]).toEqual([2, 3, 4, 5, 6]);
270
- });
271
- });
272
-
273
- describe('HashMap HOF', () => {
274
- let hashMap: HashMap;
275
-
276
- beforeEach(() => {
277
- hashMap = new HashMap<string, string>();
278
- hashMap.set('key1', 'value1');
279
- hashMap.set('key2', 'value2');
280
- hashMap.set('key3', 'value3');
281
- });
282
-
283
- test('every() returns true if all elements match the condition', () => {
284
- expect(hashMap.every(value => typeof value === 'string')).toBe(true);
285
- });
286
-
287
- test('some() returns true if any element matches the condition', () => {
288
- expect(hashMap.some((value, key) => key === 'key1')).toBe(true);
289
- });
290
-
291
- test('forEach() should execute a function for each element', () => {
292
- const mockCallback = jest.fn();
293
- hashMap.forEach(mockCallback);
294
- expect(mockCallback.mock.calls.length).toBe(3);
295
- });
296
-
297
- test('map() should transform each element', () => {
298
- const newHashMap = hashMap.map(value => value.toUpperCase());
299
- expect(newHashMap.get('key1')).toBe('VALUE1');
300
- });
301
-
302
- test('filter() should remove elements that do not match the condition', () => {
303
- const filteredHashMap = hashMap.filter((value, key) => key !== 'key1');
304
- expect(filteredHashMap.has('key1')).toBe(false);
305
- });
306
-
307
- test('reduce() should accumulate values', () => {
308
- const result = hashMap.reduce((acc, value) => acc + value, '');
309
- expect(result).toBe('value1value2value3');
310
- });
311
- });
312
-
313
- describe('LinkedHashMap Test1', () => {
314
- let hashMap: LinkedHashMap<string, number>;
315
-
316
- beforeEach(() => {
317
- hashMap = new LinkedHashMap<string, number>();
318
- });
221
+ for (const item of arr) {
222
+ if (Math.random() > 0.6) {
223
+ expect(hashMap.delete(item)).toEqual(stdMap.delete(item));
224
+ }
225
+ }
226
+ compareHashMaps(hashMap, stdMap);
319
227
 
320
- it('should initialize correctly', () => {
321
- expect(hashMap.size).toBe(0);
322
- // expect(hashMap.table.length).toBe(16);
323
- // expect(hashMap.loadFactor).toBe(0.75);
324
- // expect(hashMap.capacityMultiplier).toBe(2);
325
- // expect(hashMap.initialCapacity).toBe(16);
326
- expect(hashMap.isEmpty()).toBe(true);
228
+ for (let i = 0; i < 1000; ++i) {
229
+ const random = getRandomInt(0, 100);
230
+ expect(hashMap.delete(random)).toEqual(stdMap.delete(random));
231
+ }
232
+ compareHashMaps(hashMap, stdMap);
233
+ });
327
234
  });
328
235
 
329
- it('should put and get values', () => {
330
- hashMap.set('one', 1);
331
- hashMap.set('two', 2);
332
- hashMap.set('three', 3);
236
+ describe('HashMap for coordinate object keys', () => {
237
+ const hashMap: HashMap<[number, number], number> = new HashMap();
238
+ const codObjs: [number, number][] = [];
333
239
 
334
- expect(hashMap.get('one')).toBe(1);
335
- expect(hashMap.get('two')).toBe(2);
336
- expect(hashMap.get('three')).toBe(3);
337
- });
240
+ test('set elements in hash map', () => {
241
+ for (let i = 0; i < 1000; i++) {
242
+ const codObj: [number, number] = [getRandomInt(-10000, 10000), i];
243
+ codObjs.push(codObj);
244
+ hashMap.set(codObj, i);
245
+ }
246
+ });
338
247
 
339
- it('should handle key collisions', () => {
340
- // Force a collision by setting two different keys to the same bucket
341
- hashMap.set('key1', 1);
342
- hashMap.set('key2', 2);
248
+ test('get elements in hash map', () => {
249
+ for (let i = 0; i < 1000; i++) {
250
+ const codObj = codObjs[i];
251
+ if (codObj) {
252
+ expect(hashMap.get(codObj)).toBe(i);
253
+ }
254
+ }
255
+ });
343
256
 
344
- expect(hashMap.get('key1')).toBe(1);
345
- expect(hashMap.get('key2')).toBe(2);
257
+ test('delete elements in hash map', () => {
258
+ for (let i = 0; i < 1000; i++) {
259
+ if (i === 500) expect(hashMap.size).toBe(500);
260
+ const codObj = codObjs[i];
261
+ if (codObj) hashMap.delete(codObj);
262
+ }
263
+ expect(hashMap.size).toBe(0);
264
+ });
346
265
  });
347
266
 
348
- it('should delete values', () => {
349
- hashMap.set('one', 1);
350
- hashMap.set('two', 2);
351
-
352
- hashMap.delete('one');
353
- expect(hashMap.get('one')).toBeUndefined();
354
- expect(hashMap.size).toBe(1);
355
- });
267
+ describe('HashMap setMany, keys, values', () => {
268
+ const hm: HashMap<number, number> = new HashMap<number, number>();
269
+
270
+ beforeEach(() => {
271
+ hm.clear();
272
+ hm.setMany([
273
+ [2, 2],
274
+ [3, 3],
275
+ [4, 4],
276
+ [5, 5]
277
+ ]);
278
+ hm.setMany([
279
+ [2, 2],
280
+ [3, 3],
281
+ [4, 4],
282
+ [6, 6]
283
+ ]);
284
+ });
356
285
 
357
- it('should clear the LinkedHashMap', () => {
358
- hashMap.set('one', 1);
359
- hashMap.set('two', 2);
286
+ test('keys', () => {
287
+ expect([...hm.keys()]).toEqual([2, 3, 4, 5, 6]);
288
+ });
360
289
 
361
- hashMap.clear();
362
- expect(hashMap.size).toBe(0);
363
- expect(hashMap.isEmpty()).toBe(true);
290
+ test('values', () => {
291
+ expect([...hm.values()]).toEqual([2, 3, 4, 5, 6]);
292
+ });
364
293
  });
365
294
 
366
- it('should iterate over entries', () => {
367
- hashMap.set('one', 1);
368
- hashMap.set('two', 2);
369
- hashMap.set('three', 3);
295
+ describe('HashMap HOF', () => {
296
+ let hashMap: HashMap;
370
297
 
371
- // const entries = Array.from(hashMap.entries());
372
- // expect(entries).toContainEqual(['one', 1]);
373
- // expect(entries).toContainEqual(['two', 2]);
374
- // expect(entries).toContainEqual(['three', 3]);
375
- });
298
+ beforeEach(() => {
299
+ hashMap = new HashMap<string, string>();
300
+ hashMap.set('key1', 'value1');
301
+ hashMap.set('key2', 'value2');
302
+ hashMap.set('key3', 'value3');
303
+ });
376
304
 
377
- it('should resize the table when load factor is exceeded', () => {
378
- // Set a small initial capacity for testing resizing
379
- hashMap = new LinkedHashMap<string, number>();
305
+ test('every() returns true if all elements match the condition', () => {
306
+ expect(hashMap.every(value => typeof value === 'string')).toBe(true);
307
+ });
380
308
 
381
- hashMap.set('one', 1);
382
- hashMap.set('two', 2);
383
- hashMap.set('three', 3);
384
- hashMap.set('four', 4); // This should trigger a resize
309
+ test('some() returns true if any element matches the condition', () => {
310
+ expect(hashMap.some((value, key) => key === 'key1')).toBe(true);
311
+ });
385
312
 
386
- // expect(hashMap.table.length).toBe(8);
387
- expect(hashMap.get('one')).toBe(1);
388
- expect(hashMap.get('two')).toBe(2);
389
- expect(hashMap.get('three')).toBe(3);
390
- expect(hashMap.get('four')).toBe(4);
391
- });
313
+ test('forEach() should execute a function for each element', () => {
314
+ const mockCallback = jest.fn();
315
+ hashMap.forEach(mockCallback);
316
+ expect(mockCallback.mock.calls.length).toBe(3);
317
+ });
392
318
 
393
- it('should allow using a custom hash function', () => {
394
- hashMap = new LinkedHashMap<string, number>();
319
+ test('map() should transform each element', () => {
320
+ const newHashMap = hashMap.map(value => value.toUpperCase());
321
+ expect(newHashMap.get('key1')).toBe('VALUE1');
322
+ });
395
323
 
396
- hashMap.set('one', 1);
397
- hashMap.set('two', 2);
324
+ test('filter() should remove elements that do not match the condition', () => {
325
+ const filteredHashMap = hashMap.filter((value, key) => key !== 'key1');
326
+ expect(filteredHashMap.has('key1')).toBe(false);
327
+ });
398
328
 
399
- expect(hashMap.get('one')).toBe(1);
400
- expect(hashMap.get('two')).toBe(2);
401
- // Since the custom hash function always returns 0, these keys will collide.
402
- // Make sure they are stored separately.
403
- // expect(hashMap.table[0].length).toBe(2);
329
+ test('reduce() should accumulate values', () => {
330
+ const result = hashMap.reduce((acc, value) => acc + value, '');
331
+ expect(result).toBe('value1value2value3');
332
+ });
404
333
  });
405
-
406
- // it('should handle number keys correctly', () => {
407
- // const hm = new LinkedHashMap();
408
- // hm.set(999, { a: '999Value' });
409
- // hm.set('999', {a: '999StrValue'})
410
- // expect(hm.get(999)).toEqual({ a: '999Value' });
411
- // expect(hm.get('999')).toEqual({ a: '999StrValue1' });
412
- // });
413
334
  });
414
335
 
415
- describe('LinkedHashMap Test2', () => {
336
+ describe('LinkedHashMap', () => {
416
337
  let hashMap: LinkedHashMap;
417
338
 
418
339
  beforeEach(() => {
@@ -487,7 +408,7 @@ describe('LinkedHashMap Test2', () => {
487
408
  expect(hashMap.last).toEqual([key, value]);
488
409
  expect(hashMap.reverseBegin().next().value).toEqual([key, value]);
489
410
  } else if (index <= 1000) {
490
- expect(hashMap.getAt(index)).toBe(value);
411
+ expect(hashMap.at(index)).toBe(value);
491
412
  }
492
413
  expect(hashMap.get(key)).toEqual(value);
493
414
  index++;
@@ -536,92 +457,194 @@ describe('LinkedHashMap Test2', () => {
536
457
  test('should get element at specific index', () => {
537
458
  hashMap.set('key1', 'value1');
538
459
  hashMap.set('key2', 'value2');
539
- expect(hashMap.getAt(1)).toBe('value2');
460
+ expect(hashMap.at(1)).toBe('value2');
540
461
  });
541
- });
542
462
 
543
- describe('LinkedHashMap for coordinate object keys', () => {
544
- const hashMap: LinkedHashMap<[number, number], number> = new LinkedHashMap();
545
- const codObjs: [number, number][] = [];
463
+ describe('LinkedHashMap basic', () => {
464
+ let hashMap: LinkedHashMap<string, number>;
546
465
 
547
- test('set elements in hash map', () => {
548
- for (let i = 0; i < 1000; i++) {
549
- const codObj: [number, number] = [getRandomInt(-10000, 10000), i];
550
- codObjs.push(codObj);
551
- hashMap.set(codObj, i);
552
- }
553
- });
466
+ beforeEach(() => {
467
+ hashMap = new LinkedHashMap<string, number>();
468
+ });
554
469
 
555
- test('get elements in hash map', () => {
556
- for (let i = 0; i < 1000; i++) {
557
- const codObj = codObjs[i];
558
- if (codObj) {
559
- expect(hashMap.get(codObj)).toBe(i);
560
- }
561
- }
562
- });
470
+ it('should initialize correctly', () => {
471
+ expect(hashMap.size).toBe(0);
472
+ // expect(hashMap.table.length).toBe(16);
473
+ // expect(hashMap.loadFactor).toBe(0.75);
474
+ // expect(hashMap.capacityMultiplier).toBe(2);
475
+ // expect(hashMap.initialCapacity).toBe(16);
476
+ expect(hashMap.isEmpty()).toBe(true);
477
+ });
563
478
 
564
- test('delete elements in hash map', () => {
565
- for (let i = 0; i < 1000; i++) {
566
- if (i === 500) expect(hashMap.size).toBe(500);
567
- const codObj = codObjs[i];
568
- if (codObj) hashMap.delete(codObj);
569
- }
570
- expect(hashMap.size).toBe(0);
571
- });
572
- });
479
+ it('should put and get values', () => {
480
+ hashMap.set('one', 1);
481
+ hashMap.set('two', 2);
482
+ hashMap.set('three', 3);
573
483
 
574
- describe('LinkedHashMap setMany, keys, values', () => {
575
- const hm: LinkedHashMap<number, number> = new LinkedHashMap<number, number>();
484
+ expect(hashMap.get('one')).toBe(1);
485
+ expect(hashMap.get('two')).toBe(2);
486
+ expect(hashMap.get('three')).toBe(3);
487
+ });
576
488
 
577
- beforeEach(() => {
578
- hm.clear();
579
- hm.setMany([
580
- [2, 2],
581
- [3, 3],
582
- [4, 4],
583
- [5, 5]
584
- ]);
585
- hm.setMany([
586
- [2, 2],
587
- [3, 3],
588
- [4, 4],
589
- [6, 6]
590
- ]);
591
- });
489
+ it('should handle key collisions', () => {
490
+ // Force a collision by setting two different keys to the same bucket
491
+ hashMap.set('key1', 1);
492
+ hashMap.set('key2', 2);
592
493
 
593
- test('keys', () => {
594
- expect([...hm.keys()]).toEqual([2, 3, 4, 5, 6]);
595
- });
494
+ expect(hashMap.get('key1')).toBe(1);
495
+ expect(hashMap.get('key2')).toBe(2);
496
+ });
596
497
 
597
- test('values', () => {
598
- expect([...hm.values()]).toEqual([2, 3, 4, 5, 6]);
599
- });
498
+ it('should delete values', () => {
499
+ hashMap.set('one', 1);
500
+ hashMap.set('two', 2);
600
501
 
601
- test('entries', () => {
602
- expect([...hm.entries()]).toEqual([
603
- [2, 2],
604
- [3, 3],
605
- [4, 4],
606
- [5, 5],
607
- [6, 6]
608
- ]);
609
- });
502
+ hashMap.delete('one');
503
+ expect(hashMap.get('one')).toBeUndefined();
504
+ expect(hashMap.size).toBe(1);
505
+ });
610
506
 
611
- test('every', () => {
612
- expect(hm.every(value => value > 4)).toBe(false);
613
- });
507
+ it('should clear the LinkedHashMap', () => {
508
+ hashMap.set('one', 1);
509
+ hashMap.set('two', 2);
510
+
511
+ hashMap.clear();
512
+ expect(hashMap.size).toBe(0);
513
+ expect(hashMap.isEmpty()).toBe(true);
514
+ });
515
+
516
+ it('should iterate over entries', () => {
517
+ hashMap.set('one', 1);
518
+ hashMap.set('two', 2);
519
+ hashMap.set('three', 3);
520
+
521
+ // const entries = Array.from(hashMap.entries());
522
+ // expect(entries).toContainEqual(['one', 1]);
523
+ // expect(entries).toContainEqual(['two', 2]);
524
+ // expect(entries).toContainEqual(['three', 3]);
525
+ });
526
+
527
+ it('should resize the table when load factor is exceeded', () => {
528
+ // Set a small initial capacity for testing resizing
529
+ hashMap = new LinkedHashMap<string, number>();
530
+
531
+ hashMap.set('one', 1);
532
+ hashMap.set('two', 2);
533
+ hashMap.set('three', 3);
534
+ hashMap.set('four', 4); // This should trigger a resize
535
+
536
+ // expect(hashMap.table.length).toBe(8);
537
+ expect(hashMap.get('one')).toBe(1);
538
+ expect(hashMap.get('two')).toBe(2);
539
+ expect(hashMap.get('three')).toBe(3);
540
+ expect(hashMap.get('four')).toBe(4);
541
+ });
542
+
543
+ it('should allow using a custom hash function', () => {
544
+ hashMap = new LinkedHashMap<string, number>();
545
+
546
+ hashMap.set('one', 1);
547
+ hashMap.set('two', 2);
548
+
549
+ expect(hashMap.get('one')).toBe(1);
550
+ expect(hashMap.get('two')).toBe(2);
551
+ // Since the custom hash function always returns 0, these keys will collide.
552
+ // Make sure they are stored separately.
553
+ // expect(hashMap.table[0].length).toBe(2);
554
+ });
614
555
 
615
- test('some', () => {
616
- expect(hm.some(value => value > 6)).toBe(false);
556
+ // it('should handle number keys correctly', () => {
557
+ // const hm = new LinkedHashMap();
558
+ // hm.set(999, { a: '999Value' });
559
+ // hm.set('999', {a: '999StrValue'})
560
+ // expect(hm.get(999)).toEqual({ a: '999Value' });
561
+ // expect(hm.get('999')).toEqual({ a: '999StrValue1' });
562
+ // });
617
563
  });
618
564
 
619
- test('hasValue', () => {
620
- expect(hm.hasValue(3)).toBe(true);
621
- expect(hm.hasValue(7)).toBe(false);
565
+ describe('coordinate object keys', () => {
566
+ const hashMap: LinkedHashMap<[number, number], number> = new LinkedHashMap();
567
+ const codObjs: [number, number][] = [];
568
+
569
+ test('set elements in hash map', () => {
570
+ for (let i = 0; i < 1000; i++) {
571
+ const codObj: [number, number] = [getRandomInt(-10000, 10000), i];
572
+ codObjs.push(codObj);
573
+ hashMap.set(codObj, i);
574
+ }
575
+ });
576
+
577
+ test('get elements in hash map', () => {
578
+ for (let i = 0; i < 1000; i++) {
579
+ const codObj = codObjs[i];
580
+ if (codObj) {
581
+ expect(hashMap.get(codObj)).toBe(i);
582
+ }
583
+ }
584
+ });
585
+
586
+ test('delete elements in hash map', () => {
587
+ for (let i = 0; i < 1000; i++) {
588
+ if (i === 500) expect(hashMap.size).toBe(500);
589
+ const codObj = codObjs[i];
590
+ if (codObj) hashMap.delete(codObj);
591
+ }
592
+ expect(hashMap.size).toBe(0);
593
+ });
622
594
  });
623
595
 
624
- test('print', () => {
625
- // hm.print();
596
+ describe('setMany, keys, values', () => {
597
+ const hm: LinkedHashMap<number, number> = new LinkedHashMap<number, number>();
598
+
599
+ beforeEach(() => {
600
+ hm.clear();
601
+ hm.setMany([
602
+ [2, 2],
603
+ [3, 3],
604
+ [4, 4],
605
+ [5, 5]
606
+ ]);
607
+ hm.setMany([
608
+ [2, 2],
609
+ [3, 3],
610
+ [4, 4],
611
+ [6, 6]
612
+ ]);
613
+ });
614
+
615
+ test('keys', () => {
616
+ expect([...hm.keys()]).toEqual([2, 3, 4, 5, 6]);
617
+ });
618
+
619
+ test('values', () => {
620
+ expect([...hm.values()]).toEqual([2, 3, 4, 5, 6]);
621
+ });
622
+
623
+ test('entries', () => {
624
+ expect([...hm.entries()]).toEqual([
625
+ [2, 2],
626
+ [3, 3],
627
+ [4, 4],
628
+ [5, 5],
629
+ [6, 6]
630
+ ]);
631
+ });
632
+
633
+ test('every', () => {
634
+ expect(hm.every(value => value > 4)).toBe(false);
635
+ });
636
+
637
+ test('some', () => {
638
+ expect(hm.some(value => value > 6)).toBe(false);
639
+ });
640
+
641
+ test('hasValue', () => {
642
+ expect(hm.hasValue(3)).toBe(true);
643
+ expect(hm.hasValue(7)).toBe(false);
644
+ });
645
+
646
+ test('print', () => {
647
+ // hm.print();
648
+ });
626
649
  });
627
650
  });