alchemist-collections 0.0.1

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/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Tu Nombre
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,313 @@
1
+ # πŸ§ͺ Alchemist Collections
2
+
3
+ A high-performance collections library for TypeScript, inspired by Java collections. Provides efficient and well-tested data structures for your TypeScript/JavaScript applications.
4
+
5
+ [![npm version](https://img.shields.io/npm/v/alchemist-collections)](https://www.npmjs.com/package/alchemist-collections)
6
+ [![npm downloads](https://img.shields.io/npm/dm/alchemist-collections)](https://www.npmjs.com/package/alchemist-collections)
7
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
8
+
9
+ ## πŸš€ Features
10
+
11
+ - βœ… **ArrayList** - Dynamic list with optimized automatic growth
12
+ - βœ… **HashMap** - Hash table implementation with collision handling
13
+ - βœ… **Type-safe with full TypeScript generics** - Complete type inference and IDE support
14
+ - βœ… **High performance** - Optimized native methods (copyWithin, fill)
15
+ - βœ… **Iterable** - Compatible with `for...of` and spread operator
16
+ - βœ… **Familiar interface** - Methods similar to Java collections
17
+ - βœ… **Fully tested** - Complete test coverage
18
+ - βœ… **Zero dependencies** - Pure library with no external packages required
19
+
20
+ ## πŸ“¦ Installation
21
+
22
+ ```bash
23
+ npm install alchemist-collections
24
+ ```
25
+
26
+ ```bash
27
+ yarn add alchemist-collections
28
+ ```
29
+
30
+ ```bash
31
+ pnpm add alchemist-collections
32
+ ```
33
+
34
+ ## 🎯 Quick Start
35
+
36
+ ### ArrayList
37
+
38
+ ```typescript
39
+ import { ArrayList } from 'alchemist-collections';
40
+
41
+ // Create a list
42
+ const numbers = new ArrayList<number>();
43
+
44
+ // Add elements
45
+ numbers.add(10);
46
+ numbers.add(20);
47
+ numbers.add(30);
48
+
49
+ // Access elements
50
+ console.log(numbers.get(0)); // 10
51
+ console.log(numbers.size()); // 3
52
+
53
+ // Search elements
54
+ console.log(numbers.contains(20)); // true
55
+ console.log(numbers.indexOf(30)); // 2
56
+
57
+ // Modify elements
58
+ numbers.set(1, 25); // change index 1 to 25
59
+
60
+ // Insert at specific position
61
+ numbers.addAt(1, 15); // [10, 15, 20, 25, 30]
62
+
63
+ // Remove elements
64
+ numbers.remove(2); // remove at index 2
65
+
66
+ // Iterate
67
+ for (const num of numbers) {
68
+ console.log(num);
69
+ }
70
+
71
+ // Convert to array
72
+ const arr = numbers.toArray();
73
+
74
+ // Clear list
75
+ numbers.clear();
76
+ console.log(numbers.isEmpty()); // true
77
+ ```
78
+
79
+ ### HashMap
80
+
81
+ ```typescript
82
+ import { HashMap } from 'alchemist-collections';
83
+
84
+ // Create a map
85
+ const map = new HashMap<string, number>();
86
+
87
+ // Add key-value pairs
88
+ map.put('apple', 5);
89
+ map.put('banana', 3);
90
+ map.put('cherry', 8);
91
+
92
+ // Get values
93
+ console.log(map.get('apple')); // 5
94
+ console.log(map.size()); // 3
95
+
96
+ // Check if key exists
97
+ console.log(map.containsKey('banana')); // true
98
+
99
+ // Check if value exists
100
+ console.log(map.containsValue(3)); // true
101
+
102
+ // Get all keys
103
+ const keys = map.keys(); // ['apple', 'banana', 'cherry']
104
+
105
+ // Get all values
106
+ const values = map.values(); // [5, 3, 8]
107
+
108
+ // Get all entries
109
+ const entries = map.entries(); // [['apple', 5], ['banana', 3], ['cherry', 8]]
110
+
111
+ // Update a value
112
+ const oldValue = map.put('apple', 10); // returns 5
113
+
114
+ // Remove a key
115
+ const removed = map.remove('banana'); // returns 3
116
+
117
+ // Iterate
118
+ for (const [key, value] of map) {
119
+ console.log(`${key}: ${value}`);
120
+ }
121
+
122
+ // Clear map
123
+ map.clear();
124
+ console.log(map.isEmpty()); // true
125
+ ```
126
+
127
+ ## πŸ“š Complete API
128
+
129
+ ### ArrayList<E>
130
+
131
+ #### Constructor
132
+
133
+ ```typescript
134
+ // Default initial capacity (10)
135
+ const list = new ArrayList<string>();
136
+
137
+ // Specify initial capacity
138
+ const list = new ArrayList<string>(20);
139
+ ```
140
+
141
+ #### Methods
142
+
143
+ | Method | Description | Example |
144
+ |--------|-------------|---------|
145
+ | `add(element: E): boolean` | Adds element at the end | `list.add('hello')` |
146
+ | `addAt(index: number, element: E): void` | Adds element at specific position | `list.addAt(0, 'first')` |
147
+ | `get(index: number): E` | Gets element at index | `list.get(0)` |
148
+ | `set(index: number, element: E): E` | Sets element and returns previous | `list.set(0, 'new')` |
149
+ | `remove(index: number): E` | Removes and returns element | `list.remove(0)` |
150
+ | `contains(element: E): boolean` | Checks if element exists | `list.contains('hello')` |
151
+ | `indexOf(element: E): number` | Gets index of element | `list.indexOf('hello')` |
152
+ | `size(): number` | Returns number of elements | `list.size()` |
153
+ | `isEmpty(): boolean` | Checks if empty | `list.isEmpty()` |
154
+ | `clear(): void` | Removes all elements | `list.clear()` |
155
+ | `toArray(): E[]` | Converts to native array | `const arr = list.toArray()` |
156
+
157
+ ### HashMap<K, V>
158
+
159
+ #### Constructor
160
+
161
+ ```typescript
162
+ // Default initial capacity (16)
163
+ const map = new HashMap<string, number>();
164
+
165
+ // Specify initial capacity
166
+ const map = new HashMap<string, number>(32);
167
+ ```
168
+
169
+ #### Methods
170
+
171
+ | Method | Description | Example |
172
+ |--------|-------------|---------|
173
+ | `put(key: K, value: V): V \| undefined` | Adds/updates entry, returns old value | `map.put('name', 'John')` |
174
+ | `get(key: K): V \| undefined` | Gets value for key | `map.get('name')` |
175
+ | `remove(key: K): V \| undefined` | Removes and returns value | `map.remove('name')` |
176
+ | `containsKey(key: K): boolean` | Checks if key exists | `map.containsKey('name')` |
177
+ | `containsValue(value: V): boolean` | Checks if value exists | `map.containsValue('John')` |
178
+ | `size(): number` | Returns number of entries | `map.size()` |
179
+ | `isEmpty(): boolean` | Checks if empty | `map.isEmpty()` |
180
+ | `keys(): K[]` | Returns all keys | `const keys = map.keys()` |
181
+ | `values(): V[]` | Returns all values | `const vals = map.values()` |
182
+ | `entries(): [K, V][]` | Returns all key-value pairs | `const entries = map.entries()` |
183
+ | `clear(): void` | Removes all entries | `map.clear()` |
184
+
185
+ ## πŸ’‘ Advanced Examples
186
+
187
+ ### Working with objects
188
+
189
+ ```typescript
190
+ interface User {
191
+ id: number;
192
+ name: string;
193
+ }
194
+
195
+ const users = new ArrayList<User>();
196
+
197
+ users.add({ id: 1, name: 'Alice' });
198
+ users.add({ id: 2, name: 'Bob' });
199
+
200
+ const user = users.get(0);
201
+ console.log(user.name); // Alice
202
+ ```
203
+
204
+ ### Working with HashMap
205
+
206
+ ```typescript
207
+ interface Product {
208
+ id: string;
209
+ name: string;
210
+ price: number;
211
+ }
212
+
213
+ const products = new HashMap<string, Product>();
214
+
215
+ // Add products
216
+ products.put('PROD001', { id: 'PROD001', name: 'Laptop', price: 999 });
217
+ products.put('PROD002', { id: 'PROD002', name: 'Mouse', price: 29 });
218
+
219
+ // Find a product
220
+ const product = products.get('PROD001');
221
+ if (product) {
222
+ console.log(`${product.name}: $${product.price}`);
223
+ }
224
+
225
+ // Check inventory
226
+ console.log(products.size()); // 2
227
+
228
+ // List all product names
229
+ const names = products.values().map(p => p.name);
230
+ console.log(names); // ['Laptop', 'Mouse']
231
+ ```
232
+
233
+ ### HashMap with number keys
234
+
235
+
236
+ ```typescript
237
+ const list = new ArrayList<number>();
238
+ list.add(1);
239
+ list.add(2);
240
+ list.add(3);
241
+
242
+ // Spread
243
+ const arr = [...list]; // [1, 2, 3]
244
+
245
+ // Destructuring
246
+ const [first, second] = list; // first = 1, second = 2
247
+ ```
248
+
249
+ ### Automatic capacity growth
250
+
251
+ ```typescript
252
+ const list = new ArrayList<number>(2);
253
+ console.log(list.size()); // 0 (initial capacity 2)
254
+
255
+ // Add more elements than capacity - grows automatically
256
+ for (let i = 0; i < 100; i++) {
257
+ list.add(i);
258
+ }
259
+ console.log(list.size()); // 100
260
+ ```
261
+
262
+ ## ⚑ Performance
263
+
264
+ The library uses native optimizations:
265
+
266
+ - **`copyWithin()`** for efficient element movement in add/remove
267
+ - **`fill()`** for clearing elements in clear()
268
+ - **Dynamic growth** with 1.5x factor to minimize reallocations
269
+
270
+ Compared to native JavaScript arrays, ArrayList is ideal when you need:
271
+ - Frequent insert/remove operations at specific positions
272
+ - Type safety with TypeScript generics
273
+ - Familiar API for Java developers
274
+
275
+ ## πŸ§ͺ Testing
276
+
277
+ Run tests:
278
+
279
+ ```bash
280
+ npm run test
281
+ ```
282
+
283
+ With coverage:
284
+
285
+ ```bash
286
+ npm run test:coverage
287
+ ```
288
+
289
+ ## πŸ“ License
290
+
291
+ MIT Β© 2026
292
+
293
+ ## Legal
294
+ This project provides a TypeScript implementation of data structures inspired by the Java Collections Framework.
295
+
296
+ Java and JDK are trademarks or registered trademarks of Oracle and/or its affiliates.
297
+
298
+ This project is not affiliated with, endorsed by, or sponsored by Oracle.
299
+
300
+ ## 🀝 Contributing
301
+
302
+ Contributions are welcome! Please:
303
+
304
+ 1. Fork the project
305
+ 2. Create a feature branch (`git checkout -b feature/AmazingFeature`)
306
+ 3. Commit your changes (`git commit -m 'Add AmazingFeature'`)
307
+ 4. Push to the branch (`git push origin feature/AmazingFeature`)
308
+ 5. Open a Pull Request
309
+
310
+
311
+ ---
312
+
313
+ ⚠️ Note: This library is currently in Alpha. Interfaces may change, and I am actively working on adding new structures
@@ -0,0 +1,4 @@
1
+ export declare class IndexOutOfBoundsException extends Error {
2
+ constructor(index: number, size: number);
3
+ }
4
+ //# sourceMappingURL=IndexOutOfBoundsException.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IndexOutOfBoundsException.d.ts","sourceRoot":"","sources":["../../../../src/core/exceptions/IndexOutOfBoundsException.ts"],"names":[],"mappings":"AAAA,qBAAa,yBAA0B,SAAQ,KAAK;gBACtC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CASxC"}
@@ -0,0 +1,11 @@
1
+ export class IndexOutOfBoundsException extends Error {
2
+ constructor(index, size) {
3
+ const message = `Index: ${index}, Size ${size}`;
4
+ super(message);
5
+ this.name = 'IndexOutOfBoundsException';
6
+ if (Error.captureStackTrace) {
7
+ Error.captureStackTrace(this, IndexOutOfBoundsException);
8
+ }
9
+ }
10
+ }
11
+ //# sourceMappingURL=IndexOutOfBoundsException.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IndexOutOfBoundsException.js","sourceRoot":"","sources":["../../../../src/core/exceptions/IndexOutOfBoundsException.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAClD,YAAY,KAAa,EAAE,IAAY;QACrC,MAAM,OAAO,GAAG,UAAU,KAAK,UAAU,IAAI,EAAE,CAAC;QAChD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;QAExC,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC5B,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ export interface List<E> extends Iterable<E> {
2
+ size(): number;
3
+ isEmpty(): boolean;
4
+ add(element: E): boolean;
5
+ contains(element: E): boolean;
6
+ addAt(index: number, element: E): void;
7
+ get(index: number): E;
8
+ set(index: number, element: E): E;
9
+ remove(index: number): E;
10
+ clear(): void;
11
+ toArray(): E[];
12
+ }
13
+ //# sourceMappingURL=List.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"List.d.ts","sourceRoot":"","sources":["../../../../src/core/interfaces/List.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI,CAAC,CAAC,CAAE,SAAQ,QAAQ,CAAC,CAAC,CAAC;IAC1C,IAAI,IAAI,MAAM,CAAC;IACf,OAAO,IAAI,OAAO,CAAC;IACnB,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC;IAC9B,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC;IACvC,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC;IACtB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC;IACzB,KAAK,IAAI,IAAI,CAAC;IACd,OAAO,IAAI,CAAC,EAAE,CAAC;CAChB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=List.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"List.js","sourceRoot":"","sources":["../../../../src/core/interfaces/List.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ export interface Map<K, V> extends Iterable<[K, V]> {
2
+ size(): number;
3
+ isEmpty(): boolean;
4
+ put(key: K, value: V): V | undefined;
5
+ get(key: K): V | undefined;
6
+ containsKey(key: K): boolean;
7
+ containsValue(value: V): boolean;
8
+ remove(key: K): V | undefined;
9
+ clear(): void;
10
+ keys(): K[];
11
+ values(): V[];
12
+ entries(): [K, V][];
13
+ }
14
+ //# sourceMappingURL=Map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Map.d.ts","sourceRoot":"","sources":["../../../../src/core/interfaces/Map.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC,CAAE,SAAQ,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjD,IAAI,IAAI,MAAM,CAAC;IACf,OAAO,IAAI,OAAO,CAAC;IACnB,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IACrC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAC3B,WAAW,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC;IAC7B,aAAa,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC;IACjC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAC9B,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,IAAI,CAAC,EAAE,CAAC;IACZ,MAAM,IAAI,CAAC,EAAE,CAAC;IACd,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;CACrB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Map.js","sourceRoot":"","sources":["../../../../src/core/interfaces/Map.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ export type { List } from './core/interfaces/List.js';
2
+ export type { Map } from './core/interfaces/Map.js';
3
+ export { ArrayList } from './modules/lists/ArrayList.js';
4
+ export { HashMap } from './modules/maps/HashMap.js';
5
+ export { IndexOutOfBoundsException } from './core/exceptions/IndexOutOfBoundsException.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AACrD,YAAY,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,+CAA+C,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { ArrayList } from './modules/lists/ArrayList.js';
2
+ export { HashMap } from './modules/maps/HashMap.js';
3
+ export { IndexOutOfBoundsException } from './core/exceptions/IndexOutOfBoundsException.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,+CAA+C,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { List } from '../../core/interfaces/List.js';
2
+ export declare class ArrayList<E> implements List<E> {
3
+ private elementData;
4
+ private _size;
5
+ private static readonly DEFAULT_CAPACITY;
6
+ constructor(initialCapacity?: number);
7
+ private rangeCheck;
8
+ private rangeCheckForAdd;
9
+ size(): number;
10
+ isEmpty(): boolean;
11
+ get(index: number): E;
12
+ indexOf(element: E): number;
13
+ contains(element: E): boolean;
14
+ add(element: E): boolean;
15
+ addAt(index: number, element: E): void;
16
+ set(index: number, element: E): E;
17
+ remove(index: number): E;
18
+ clear(): void;
19
+ toArray(): E[];
20
+ [Symbol.iterator](): Iterator<E>;
21
+ ensureCapacity(minCapacity: number): void;
22
+ private grow;
23
+ }
24
+ //# sourceMappingURL=ArrayList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArrayList.d.ts","sourceRoot":"","sources":["../../../../src/modules/lists/ArrayList.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAGrD,qBAAa,SAAS,CAAC,CAAC,CAAE,YAAW,IAAI,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAM;gBAElC,eAAe,GAAE,MAAmC;IAKhE,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,gBAAgB;IAMxB,IAAI,IAAI,MAAM;IAId,OAAO,IAAI,OAAO;IAIlB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC;IAKrB,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,MAAM;IAO3B,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO;IAI7B,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO;IAMxB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI;IAUtC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC;IAOjC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC;IAaxB,KAAK,IAAI,IAAI;IAKb,OAAO,IAAI,CAAC,EAAE;IAIb,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC;IAM1B,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAMhD,OAAO,CAAC,IAAI;CAWb"}
@@ -0,0 +1,94 @@
1
+ import { IndexOutOfBoundsException } from '../../core/exceptions/IndexOutOfBoundsException.js';
2
+ export class ArrayList {
3
+ elementData;
4
+ _size;
5
+ static DEFAULT_CAPACITY = 10;
6
+ constructor(initialCapacity = ArrayList.DEFAULT_CAPACITY) {
7
+ this.elementData = new Array(initialCapacity);
8
+ this._size = 0;
9
+ }
10
+ rangeCheck(index) {
11
+ if (index >= this._size || index < 0) {
12
+ throw new IndexOutOfBoundsException(index, this._size);
13
+ }
14
+ }
15
+ rangeCheckForAdd(index) {
16
+ if (index > this._size || index < 0) {
17
+ throw new IndexOutOfBoundsException(index, this._size);
18
+ }
19
+ }
20
+ size() {
21
+ return this._size;
22
+ }
23
+ isEmpty() {
24
+ return this._size === 0;
25
+ }
26
+ get(index) {
27
+ this.rangeCheck(index);
28
+ return this.elementData[index];
29
+ }
30
+ indexOf(element) {
31
+ for (let i = 0; i < this._size; i++) {
32
+ if (this.elementData[i] === element)
33
+ return i;
34
+ }
35
+ return -1;
36
+ }
37
+ contains(element) {
38
+ return this.indexOf(element) >= 0;
39
+ }
40
+ add(element) {
41
+ this.ensureCapacity(this._size + 1);
42
+ this.elementData[this._size++] = element;
43
+ return true;
44
+ }
45
+ addAt(index, element) {
46
+ this.rangeCheckForAdd(index);
47
+ this.ensureCapacity(this._size + 1);
48
+ this.elementData.copyWithin(index + 1, index, this._size);
49
+ this.elementData[index] = element;
50
+ this._size++;
51
+ }
52
+ set(index, element) {
53
+ this.rangeCheck(index);
54
+ const oldElement = this.elementData[index];
55
+ this.elementData[index] = element;
56
+ return oldElement;
57
+ }
58
+ remove(index) {
59
+ this.rangeCheck(index);
60
+ const oldValue = this.elementData[index];
61
+ const numMoved = this._size - index - 1;
62
+ if (numMoved > 0) {
63
+ this.elementData.copyWithin(index, index + 1, this._size);
64
+ }
65
+ this.elementData[--this._size] = undefined;
66
+ return oldValue;
67
+ }
68
+ clear() {
69
+ this.elementData.fill(undefined, 0, this._size);
70
+ this._size = 0;
71
+ }
72
+ toArray() {
73
+ return this.elementData.slice(0, this._size);
74
+ }
75
+ *[Symbol.iterator]() {
76
+ for (let i = 0; i < this._size; i++) {
77
+ yield this.elementData[i];
78
+ }
79
+ }
80
+ ensureCapacity(minCapacity) {
81
+ if (minCapacity > this.elementData.length) {
82
+ this.grow(minCapacity);
83
+ }
84
+ }
85
+ grow(minCapacity) {
86
+ const oldCapacity = this.elementData.length;
87
+ let newCapacity = oldCapacity === 0 ? 1 : oldCapacity + (oldCapacity >> 1);
88
+ if (newCapacity < minCapacity) {
89
+ newCapacity = minCapacity;
90
+ }
91
+ this.elementData = this.elementData.slice(0, this._size).concat(new Array(newCapacity - this._size));
92
+ }
93
+ }
94
+ //# sourceMappingURL=ArrayList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArrayList.js","sourceRoot":"","sources":["../../../../src/modules/lists/ArrayList.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { Map } from '../../core/interfaces/Map.js';
2
+ export declare class HashMap<K, V> implements Map<K, V> {
3
+ private buckets;
4
+ private _size;
5
+ private static readonly DEFAULT_CAPACITY;
6
+ private static readonly LOAD_FACTOR;
7
+ constructor(initialCapacity?: number);
8
+ private hash;
9
+ private getBucketIndex;
10
+ private findEntry;
11
+ private keysEqual;
12
+ private resize;
13
+ size(): number;
14
+ isEmpty(): boolean;
15
+ put(key: K, value: V): V | undefined;
16
+ get(key: K): V | undefined;
17
+ containsKey(key: K): boolean;
18
+ containsValue(value: V): boolean;
19
+ remove(key: K): V | undefined;
20
+ clear(): void;
21
+ keys(): K[];
22
+ values(): V[];
23
+ entries(): [K, V][];
24
+ [Symbol.iterator](): Iterator<[K, V]>;
25
+ }
26
+ //# sourceMappingURL=HashMap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HashMap.d.ts","sourceRoot":"","sources":["../../../../src/modules/maps/HashMap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAQnD,qBAAa,OAAO,CAAC,CAAC,EAAE,CAAC,CAAE,YAAW,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAM;IAC9C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAQ;gBAE/B,eAAe,GAAE,MAAiC;IAK9D,OAAO,CAAC,IAAI;IAWZ,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,SAAS;IAkBjB,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,MAAM;IAcd,IAAI,IAAI,MAAM;IAId,OAAO,IAAI,OAAO;IAIlB,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IA4BpC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAK1B,WAAW,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAI5B,aAAa,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO;IAiBhC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAqB7B,KAAK,IAAI,IAAI;IAKb,IAAI,IAAI,CAAC,EAAE;IAYX,MAAM,IAAI,CAAC,EAAE;IAYb,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;IAYlB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CASvC"}
@@ -0,0 +1,170 @@
1
+ export class HashMap {
2
+ buckets;
3
+ _size;
4
+ static DEFAULT_CAPACITY = 16;
5
+ static LOAD_FACTOR = 0.75;
6
+ constructor(initialCapacity = HashMap.DEFAULT_CAPACITY) {
7
+ this.buckets = new Array(initialCapacity);
8
+ this._size = 0;
9
+ }
10
+ hash(key) {
11
+ const stringKey = String(key);
12
+ let hash = 0;
13
+ for (let i = 0; i < stringKey.length; i++) {
14
+ const char = stringKey.charCodeAt(i);
15
+ hash = (hash << 5) - hash + char;
16
+ hash = hash & hash; // Convert to 32bit integer
17
+ }
18
+ return Math.abs(hash);
19
+ }
20
+ getBucketIndex(hash) {
21
+ return hash % this.buckets.length;
22
+ }
23
+ findEntry(key) {
24
+ const hash = this.hash(key);
25
+ const bucketIndex = this.getBucketIndex(hash);
26
+ const bucket = this.buckets[bucketIndex];
27
+ if (!bucket) {
28
+ return undefined;
29
+ }
30
+ for (const entry of bucket) {
31
+ if (this.keysEqual(entry.key, key)) {
32
+ return entry;
33
+ }
34
+ }
35
+ return undefined;
36
+ }
37
+ keysEqual(key1, key2) {
38
+ if (key1 === key2) {
39
+ return true;
40
+ }
41
+ if (typeof key1 === 'object' && typeof key2 === 'object' && key1 !== null && key2 !== null) {
42
+ return JSON.stringify(key1) === JSON.stringify(key2);
43
+ }
44
+ return false;
45
+ }
46
+ resize() {
47
+ const oldBuckets = this.buckets;
48
+ this.buckets = new Array(oldBuckets.length * 2);
49
+ this._size = 0;
50
+ for (const bucket of oldBuckets) {
51
+ if (bucket) {
52
+ for (const entry of bucket) {
53
+ this.put(entry.key, entry.value);
54
+ }
55
+ }
56
+ }
57
+ }
58
+ size() {
59
+ return this._size;
60
+ }
61
+ isEmpty() {
62
+ return this._size === 0;
63
+ }
64
+ put(key, value) {
65
+ const hash = this.hash(key);
66
+ const bucketIndex = this.getBucketIndex(hash);
67
+ if (!this.buckets[bucketIndex]) {
68
+ this.buckets[bucketIndex] = [];
69
+ }
70
+ const bucket = this.buckets[bucketIndex];
71
+ for (const entry of bucket) {
72
+ if (this.keysEqual(entry.key, key)) {
73
+ const oldValue = entry.value;
74
+ entry.value = value;
75
+ return oldValue;
76
+ }
77
+ }
78
+ bucket.push({ key, value, hash });
79
+ this._size++;
80
+ if (this._size / this.buckets.length > HashMap.LOAD_FACTOR) {
81
+ this.resize();
82
+ }
83
+ return undefined;
84
+ }
85
+ get(key) {
86
+ const entry = this.findEntry(key);
87
+ return entry?.value;
88
+ }
89
+ containsKey(key) {
90
+ return this.findEntry(key) !== undefined;
91
+ }
92
+ containsValue(value) {
93
+ for (const bucket of this.buckets) {
94
+ if (bucket) {
95
+ for (const entry of bucket) {
96
+ if (entry.value === value ||
97
+ (typeof entry.value === 'object' &&
98
+ JSON.stringify(entry.value) === JSON.stringify(value))) {
99
+ return true;
100
+ }
101
+ }
102
+ }
103
+ }
104
+ return false;
105
+ }
106
+ remove(key) {
107
+ const hash = this.hash(key);
108
+ const bucketIndex = this.getBucketIndex(hash);
109
+ const bucket = this.buckets[bucketIndex];
110
+ if (!bucket) {
111
+ return undefined;
112
+ }
113
+ for (let i = 0; i < bucket.length; i++) {
114
+ const entry = bucket[i];
115
+ if (entry && this.keysEqual(entry.key, key)) {
116
+ const removedEntry = bucket.splice(i, 1)[0];
117
+ this._size--;
118
+ return removedEntry?.value;
119
+ }
120
+ }
121
+ return undefined;
122
+ }
123
+ clear() {
124
+ this.buckets = new Array(HashMap.DEFAULT_CAPACITY);
125
+ this._size = 0;
126
+ }
127
+ keys() {
128
+ const keys = [];
129
+ for (const bucket of this.buckets) {
130
+ if (bucket) {
131
+ for (const entry of bucket) {
132
+ keys.push(entry.key);
133
+ }
134
+ }
135
+ }
136
+ return keys;
137
+ }
138
+ values() {
139
+ const values = [];
140
+ for (const bucket of this.buckets) {
141
+ if (bucket) {
142
+ for (const entry of bucket) {
143
+ values.push(entry.value);
144
+ }
145
+ }
146
+ }
147
+ return values;
148
+ }
149
+ entries() {
150
+ const entries = [];
151
+ for (const bucket of this.buckets) {
152
+ if (bucket) {
153
+ for (const entry of bucket) {
154
+ entries.push([entry.key, entry.value]);
155
+ }
156
+ }
157
+ }
158
+ return entries;
159
+ }
160
+ *[Symbol.iterator]() {
161
+ for (const bucket of this.buckets) {
162
+ if (bucket) {
163
+ for (const entry of bucket) {
164
+ yield [entry.key, entry.value];
165
+ }
166
+ }
167
+ }
168
+ }
169
+ }
170
+ //# sourceMappingURL=HashMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HashMap.js","sourceRoot":"","sources":["../../../../src/modules/maps/HashMap.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "alchemist-collections",
3
+ "version": "0.0.1",
4
+ "description": "A Java-like collections framework for TypeScript.",
5
+ "main": "dist/src/index.js",
6
+ "module": "./dist/src/index.js",
7
+ "types": "./dist/src/index.js",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/src/index.js",
11
+ "import": "./dist/src/index.js"
12
+ }
13
+ },
14
+ "scripts": {
15
+ "dev": "npm run test:watch",
16
+ "build": "rm -rf dist && tsc && tsc-alias",
17
+ "prepublishOnly": "npm run build && npm run test",
18
+ "test": "vitest run",
19
+ "test:watch": "vitest",
20
+ "test:ui": "vitest --ui",
21
+ "test:coverage": "vitest run --coverage",
22
+ "lint": "eslint .",
23
+ "lint:fix": "eslint . --fix",
24
+ "format": "prettier --write \"src/**/*.ts\""
25
+ },
26
+ "keywords": [
27
+ "arraylist",
28
+ "collections",
29
+ "typescript",
30
+ "data-structures",
31
+ "java-like",
32
+ "framework",
33
+ "library",
34
+ "typescript-collections"
35
+ ],
36
+ "author": "AndrΓ©s Duarte <andres.duarte.marquez@gmail.com>",
37
+ "license": "MIT",
38
+ "type": "module",
39
+ "files": [
40
+ "dist/src",
41
+ "dist/index.js",
42
+ "dist/index.d.ts",
43
+ "README.md",
44
+ "LICENSE"
45
+ ],
46
+ "devDependencies": {
47
+ "@eslint/js": "^10.0.1",
48
+ "@types/node": "^25.6.1",
49
+ "@vitest/coverage-v8": "^4.1.5",
50
+ "eslint": "^10.3.0",
51
+ "eslint-config-prettier": "^10.1.8",
52
+ "eslint-plugin-prettier": "^5.5.5",
53
+ "globals": "^17.6.0",
54
+ "pino-pretty": "^13.1.3",
55
+ "prettier": "^3.8.3",
56
+ "tsc-alias": "^1.8.17",
57
+ "tsx": "^4.21.0",
58
+ "typescript": "^6.0.3",
59
+ "typescript-eslint": "^8.59.2",
60
+ "vitest": "^4.1.5"
61
+ }
62
+ }