ts-data-forge 1.5.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +13 -1
  2. package/dist/array/array-utils.d.mts +693 -351
  3. package/dist/array/array-utils.d.mts.map +1 -1
  4. package/dist/array/array-utils.mjs +474 -1541
  5. package/dist/array/array-utils.mjs.map +1 -1
  6. package/dist/array/index.d.mts +0 -1
  7. package/dist/array/index.d.mts.map +1 -1
  8. package/dist/array/index.mjs +0 -1
  9. package/dist/array/index.mjs.map +1 -1
  10. package/dist/collections/imap-mapped.mjs.map +1 -1
  11. package/dist/collections/imap.mjs.map +1 -1
  12. package/dist/collections/iset-mapped.mjs.map +1 -1
  13. package/dist/collections/iset.mjs.map +1 -1
  14. package/dist/collections/queue.mjs +0 -1
  15. package/dist/collections/queue.mjs.map +1 -1
  16. package/dist/collections/stack.mjs +4 -5
  17. package/dist/collections/stack.mjs.map +1 -1
  18. package/dist/functional/match.d.mts +2 -33
  19. package/dist/functional/match.d.mts.map +1 -1
  20. package/dist/functional/match.mjs +2 -119
  21. package/dist/functional/match.mjs.map +1 -1
  22. package/dist/functional/optional.d.mts +29 -51
  23. package/dist/functional/optional.d.mts.map +1 -1
  24. package/dist/functional/optional.mjs +40 -171
  25. package/dist/functional/optional.mjs.map +1 -1
  26. package/dist/functional/pipe.d.mts +2 -15
  27. package/dist/functional/pipe.d.mts.map +1 -1
  28. package/dist/functional/pipe.mjs +2 -110
  29. package/dist/functional/pipe.mjs.map +1 -1
  30. package/dist/functional/result.d.mts +18 -45
  31. package/dist/functional/result.d.mts.map +1 -1
  32. package/dist/functional/result.mjs +40 -196
  33. package/dist/functional/result.mjs.map +1 -1
  34. package/dist/globals.d.mts +10 -9
  35. package/dist/index.mjs +0 -1
  36. package/dist/index.mjs.map +1 -1
  37. package/dist/iterator/range.d.mts +2 -6
  38. package/dist/iterator/range.d.mts.map +1 -1
  39. package/dist/iterator/range.mjs +2 -93
  40. package/dist/iterator/range.mjs.map +1 -1
  41. package/dist/json/json.mjs +0 -1
  42. package/dist/json/json.mjs.map +1 -1
  43. package/dist/number/num.d.mts +3 -6
  44. package/dist/number/num.d.mts.map +1 -1
  45. package/dist/number/num.mjs +4 -22
  46. package/dist/number/num.mjs.map +1 -1
  47. package/dist/number/refined-number-utils.mjs.map +1 -1
  48. package/dist/object/object.d.mts +4 -10
  49. package/dist/object/object.d.mts.map +1 -1
  50. package/dist/object/object.mjs +8 -140
  51. package/dist/object/object.mjs.map +1 -1
  52. package/dist/others/map-nullable.d.mts +2 -6
  53. package/dist/others/map-nullable.d.mts.map +1 -1
  54. package/dist/others/map-nullable.mjs +2 -146
  55. package/dist/others/map-nullable.mjs.map +1 -1
  56. package/dist/others/memoize-function.mjs.map +1 -1
  57. package/dist/others/unknown-to-string.mjs.map +1 -1
  58. package/package.json +12 -12
  59. package/src/array/array-utils-modification.test.mts +93 -67
  60. package/src/array/array-utils-overload-type-error.test.mts +2 -2
  61. package/src/array/array-utils-reducing-value.test.mts +31 -37
  62. package/src/array/array-utils-slice-clamped.test.mts +94 -70
  63. package/src/array/array-utils-transformation.test.mts +557 -10
  64. package/src/array/array-utils.mts +1835 -1000
  65. package/src/array/index.mts +0 -1
  66. package/src/collections/queue.mts +2 -2
  67. package/src/collections/stack.mts +8 -8
  68. package/src/functional/match.mts +18 -44
  69. package/src/functional/optional.mts +88 -102
  70. package/src/functional/pipe.mts +25 -20
  71. package/src/functional/result.mts +114 -124
  72. package/src/globals.d.mts +10 -9
  73. package/src/iterator/range.mts +14 -17
  74. package/src/number/num.mts +16 -12
  75. package/src/object/object.mts +30 -45
  76. package/src/others/map-nullable.mts +13 -15
  77. package/dist/array/tuple-utils.d.mts +0 -421
  78. package/dist/array/tuple-utils.d.mts.map +0 -1
  79. package/dist/array/tuple-utils.mjs +0 -391
  80. package/dist/array/tuple-utils.mjs.map +0 -1
  81. package/src/array/tuple-utils.mts +0 -519
  82. package/src/array/tuple-utils.test.mts +0 -518
@@ -1,391 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-unsafe-type-assertion */
2
- /**
3
- * A collection of tuple utility functions.
4
- *
5
- * Provides type-safe operations for working with tuples (fixed-length arrays).
6
- * Unlike regular arrays, tuples preserve their exact length and element types
7
- * at compile time, enabling precise type inference and validation.
8
- *
9
- * Key features:
10
- * - All operations preserve tuple length and element types
11
- * - Type-safe indexing with compile-time bounds checking
12
- * - Immutable operations that return new tuples
13
- * - Precise type inference for transformed elements
14
- *
15
- * @example
16
- * ```typescript
17
- * // Tuples preserve exact types and length
18
- * const tuple = [1, 'hello', true] as const;
19
- * type TupleType = typeof tuple; // readonly [1, 'hello', true]
20
- *
21
- * // Operations preserve tuple structure
22
- * const mapped = Tpl.map(tuple, (x) => String(x)); // readonly ['1', 'hello', 'true']
23
- * const reversed = Tpl.toReversed(tuple); // readonly [true, 'hello', 1]
24
- * ```
25
- */
26
- var Tpl;
27
- (function (Tpl) {
28
- // length: size,
29
- /**
30
- * Returns the length of a tuple as a literal type.
31
- *
32
- * Unlike `array.length` which returns `number`, this preserves
33
- * the exact length as a literal type (e.g., `3` not `number`).
34
- *
35
- * @template T - The tuple type whose length will be extracted
36
- * @param list - The input tuple
37
- * @returns The length of the tuple as a literal number type
38
- *
39
- * @example
40
- * ```typescript
41
- * const tpl = [1, 2, 3] as const;
42
- * const len = Tpl.size(tpl); // 3 (literal type, not just number)
43
- *
44
- * // Type-level length extraction
45
- * type Len = Length<typeof tpl>; // 3
46
- *
47
- * // Useful for compile-time validation
48
- * function requiresTriple<T extends readonly [unknown, unknown, unknown]>(t: T) {}
49
- * const pair = [1, 2] as const;
50
- * // requiresTriple(pair); // Error: length mismatch
51
- * ```
52
- */
53
- Tpl.size = (list) => list.length;
54
- Tpl.length = Tpl.size;
55
- /**
56
- * Finds the index of the first element in a tuple that satisfies the predicate.
57
- *
58
- * Returns a type-safe index that can be one of the valid tuple indices or -1.
59
- * The return type is precisely inferred based on the tuple's length.
60
- *
61
- * @template T - The tuple type to search within
62
- * @param tpl - The input tuple
63
- * @param predicate - A function to test each element for a condition
64
- * @returns The index of the first matching element, or -1 if not found
65
- *
66
- * @example
67
- * ```typescript
68
- * const tpl = [1, 2, 3, 4] as const;
69
- * const idx1 = Tpl.findIndex(tpl, (x) => x > 2); // 2 | 3 | -1
70
- * const idx2 = Tpl.findIndex(tpl, (x) => x > 10); // -1
71
- *
72
- * // Type-safe indexing
73
- * if (idx1 !== -1) {
74
- * const value = tpl[idx1]; // Safe access, TypeScript knows idx1 is valid
75
- * }
76
- *
77
- * // With mixed types
78
- * const mixed = [1, 'hello', true, null] as const;
79
- * const strIndex = Tpl.findIndex(mixed, (x) => typeof x === 'string'); // 1 | -1
80
- * ```
81
- */
82
- Tpl.findIndex = (tpl, predicate) => tpl.findIndex((value, index) => predicate(value, index));
83
- /**
84
- * Returns the first index at which a given element can be found in the tuple.
85
- *
86
- * Performs strict equality checking (===) and returns a type-safe index.
87
- * The return type precisely reflects the possible indices of the tuple.
88
- *
89
- * @template T - The tuple type to search within
90
- * @param tpl - The input tuple
91
- * @param searchElement - Element to locate in the tuple (must be assignable to tuple's element types)
92
- * @param fromIndex - Optional index to start the search at (defaults to 0)
93
- * @returns The first index of the element, or -1 if not found
94
- *
95
- * @example
96
- * ```typescript
97
- * const tpl = ['a', 'b', 'c', 'b'] as const;
98
- * const idx1 = Tpl.indexOf(tpl, 'b'); // 1 | 3 | -1 (type shows possible indices)
99
- * const idx2 = Tpl.indexOf(tpl, 'b', 2); // 3 | -1 (search from index 2)
100
- * const idx3 = Tpl.indexOf(tpl, 'd'); // -1
101
- *
102
- * // Type safety with literal types
103
- * const nums = [1, 2, 3, 2] as const;
104
- * const twoIndex = Tpl.indexOf(nums, 2); // 1 | 3 | -1
105
- * // Tpl.indexOf(nums, '2'); // Error: string not assignable to 1 | 2 | 3
106
- *
107
- * // Works with mixed types
108
- * const mixed = [1, 'hello', true, 1] as const;
109
- * const oneIndex = Tpl.indexOf(mixed, 1); // 0 | 3 | -1
110
- * ```
111
- */
112
- Tpl.indexOf = (tpl, searchElement, fromIndex) => tpl.indexOf(searchElement, fromIndex);
113
- /**
114
- * Returns the last index at which a given element can be found in the tuple.
115
- *
116
- * Searches backwards from the end (or from `fromIndex` if provided) and
117
- * returns a type-safe index reflecting the tuple's structure.
118
- *
119
- * @template T - The tuple type to search within
120
- * @param tpl - The input tuple
121
- * @param searchElement - Element to locate in the tuple
122
- * @param fromIndex - Optional index to start searching backwards from (defaults to last index)
123
- * @returns The last index of the element, or -1 if not found
124
- *
125
- * @example
126
- * ```typescript
127
- * const tpl = ['a', 'b', 'c', 'b'] as const;
128
- * const idx1 = Tpl.lastIndexOf(tpl, 'b'); // 3 | 1 | -1
129
- * const idx2 = Tpl.lastIndexOf(tpl, 'b', 2); // 1 | -1 (search up to index 2)
130
- * const idx3 = Tpl.lastIndexOf(tpl, 'd'); // -1
131
- *
132
- * // With duplicate values
133
- * const nums = [1, 2, 3, 2, 1] as const;
134
- * const lastOne = Tpl.lastIndexOf(nums, 1); // 4 | 0 | -1
135
- * const lastTwo = Tpl.lastIndexOf(nums, 2); // 3 | 1 | -1
136
- *
137
- * // Type safety preserved
138
- * const mixed = [true, 42, 'str', 42] as const;
139
- * const last42 = Tpl.lastIndexOf(mixed, 42); // 3 | 1 | -1
140
- * // Tpl.lastIndexOf(mixed, false); // Error: false not in tuple type
141
- * ```
142
- */
143
- Tpl.lastIndexOf = (tpl, searchElement, fromIndex) => tpl.lastIndexOf(searchElement, fromIndex);
144
- /**
145
- * Creates a new tuple by transforming each element with a mapping function.
146
- *
147
- * Preserves the tuple's length while allowing element type transformation.
148
- * The resulting tuple has the same structure but with transformed element types.
149
- *
150
- * @template T - The type of the input tuple
151
- * @template B - The type that elements will be transformed to
152
- * @param tpl - The input tuple
153
- * @param mapFn - Function that transforms each element (receives element and index)
154
- * @returns A new tuple with transformed elements, preserving the original length
155
- *
156
- * @example
157
- * ```typescript
158
- * // Basic transformation
159
- * const nums = [1, 2, 3] as const;
160
- * const doubled = Tpl.map(nums, (x) => x * 2); // readonly [2, 4, 6]
161
- * const strings = Tpl.map(nums, (x) => String(x)); // readonly ['1', '2', '3']
162
- *
163
- * // With index
164
- * const indexed = Tpl.map(nums, (x, i) => `${i}:${x}`);
165
- * // readonly ['0:1', '1:2', '2:3']
166
- *
167
- * // Mixed type tuples
168
- * const mixed = [1, 'hello', true] as const;
169
- * const descriptions = Tpl.map(mixed, (x) => `Value: ${x}`);
170
- * // readonly ['Value: 1', 'Value: hello', 'Value: true']
171
- *
172
- * // Type transformation preserves tuple structure
173
- * type Original = readonly [number, string, boolean];
174
- * type Mapped = { readonly [K in keyof Original]: string };
175
- * // Mapped = readonly [string, string, string]
176
- * ```
177
- */
178
- Tpl.map = (tpl, mapFn) => tpl.map((a, index) => mapFn(a, index));
179
- // modification (returns new array)
180
- /**
181
- * Returns a new tuple with the element at the specified index replaced.
182
- *
183
- * This operation is type-safe with compile-time index validation.
184
- * The resulting tuple type reflects that the element at the given index
185
- * may be either the new type or the original type.
186
- *
187
- * @template T - The type of the input tuple
188
- * @template N - The type of the new value to set
189
- * @param tpl - The input tuple
190
- * @param index - The index to update (must be valid for the tuple length)
191
- * @param newValue - The new value to place at the index
192
- * @returns A new tuple with the updated element
193
- *
194
- * @example
195
- * ```typescript
196
- * // Basic usage
197
- * const tpl = ['a', 'b', 'c'] as const;
198
- * const updated = Tpl.set(tpl, 1, 'B'); // readonly ['a', 'B', 'c']
199
- *
200
- * // Type changes are reflected
201
- * const mixed = [1, 'hello', true] as const;
202
- * const withNumber = Tpl.set(mixed, 1, 42);
203
- * // readonly [1, 42 | 'hello', true]
204
- *
205
- * // Compile-time index validation
206
- * const short = [1, 2] as const;
207
- * // Tpl.set(short, 2, 3); // Error: index 2 is out of bounds
208
- *
209
- * // Different value types
210
- * const nums = [1, 2, 3] as const;
211
- * const withString = Tpl.set(nums, 0, 'first');
212
- * // readonly ['first' | 1, 2, 3]
213
- * ```
214
- */
215
- Tpl.set = (tpl, index, newValue) => Tpl.map(tpl, (a, i) => (i === index ? newValue : a));
216
- /**
217
- * Returns a new tuple with an element updated by applying a function.
218
- *
219
- * Similar to `set`, but instead of providing a new value directly,
220
- * you provide a function that transforms the existing value.
221
- * Useful for computed updates based on the current value.
222
- *
223
- * @template T - The type of the input tuple
224
- * @template N - The type returned by the updater function
225
- * @param tpl - The input tuple
226
- * @param index - The index of the element to update
227
- * @param updater - Function that transforms the current value to a new value
228
- * @returns A new tuple with the updated element
229
- *
230
- * @example
231
- * ```typescript
232
- * // Numeric updates
233
- * const nums = [1, 2, 3] as const;
234
- * const doubled = Tpl.toUpdated(nums, 1, (x) => x * 10);
235
- * // readonly [1, 20, 3]
236
- *
237
- * // String transformations
238
- * const strs = ['hello', 'world', '!'] as const;
239
- * const uppercased = Tpl.toUpdated(strs, 0, (s) => s.toUpperCase());
240
- * // readonly ['HELLO', 'world', '!']
241
- *
242
- * // Complex transformations
243
- * const data = [{count: 1}, {count: 2}, {count: 3}] as const;
244
- * const incremented = Tpl.toUpdated(data, 1, (obj) => ({count: obj.count + 1}));
245
- * // Updates the second object's count to 3
246
- *
247
- * // Type changes through updater
248
- * const mixed = [1, 'hello', true] as const;
249
- * const stringified = Tpl.toUpdated(mixed, 0, (n) => `Number: ${n}`);
250
- * // readonly ['Number: 1' | 1, 'hello', true]
251
- * ```
252
- */
253
- Tpl.toUpdated = (tpl, index, updater) => Tpl.map(tpl, (a, i) => (i === index ? updater(a) : a));
254
- // transformation
255
- /**
256
- * Reverses a tuple, preserving element types in their new positions.
257
- *
258
- * The type system precisely tracks the reversal, so the returned tuple
259
- * has its element types in the exact reverse order. This is more precise
260
- * than array reversal which loses positional type information.
261
- *
262
- * @template T - The tuple type to reverse
263
- * @param tpl - The input tuple
264
- * @returns A new tuple with elements in reverse order and precise typing
265
- *
266
- * @example
267
- * ```typescript
268
- * // Basic reversal
269
- * const nums = [1, 2, 3] as const;
270
- * const reversed = Tpl.toReversed(nums); // readonly [3, 2, 1]
271
- *
272
- * // Mixed types preserved in reverse positions
273
- * const mixed = [1, 'hello', true, null] as const;
274
- * const revMixed = Tpl.toReversed(mixed);
275
- * // readonly [null, true, 'hello', 1]
276
- *
277
- * // Type-level reversal
278
- * type Original = readonly [number, string, boolean];
279
- * type Reversed = Tuple.Reverse<Original>;
280
- * // Reversed = readonly [boolean, string, number]
281
- *
282
- * // Empty and single-element tuples
283
- * const empty = [] as const;
284
- * const revEmpty = Tpl.toReversed(empty); // readonly []
285
- * const single = [42] as const;
286
- * const revSingle = Tpl.toReversed(single); // readonly [42]
287
- * ```
288
- */
289
- Tpl.toReversed = (tpl) =>
290
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
291
- tpl.toReversed();
292
- /**
293
- * Sorts a tuple's elements, returning a new tuple with the same length.
294
- *
295
- * Unlike array sorting, this preserves the tuple's length but loses
296
- * positional type information (all positions can contain any element
297
- * from the original tuple). Default comparison is numeric ascending.
298
- *
299
- * @template T - The tuple type to sort
300
- * @param tpl - The input tuple
301
- * @param comparator - Optional comparison function (defaults to numeric comparison)
302
- * @returns A new tuple with sorted elements
303
- *
304
- * @example
305
- * ```typescript
306
- * // Default numeric sorting
307
- * const nums = [3, 1, 4, 1, 5] as const;
308
- * const sorted = Tpl.toSorted(nums); // readonly [1, 1, 3, 4, 5]
309
- *
310
- * // Custom comparator
311
- * const descending = Tpl.toSorted(nums, (a, b) => b - a);
312
- * // readonly [5, 4, 3, 1, 1]
313
- *
314
- * // String sorting with comparator
315
- * const strs = ['banana', 'apple', 'cherry'] as const;
316
- * const alphaSorted = Tpl.toSorted(strs, (a, b) => a.localeCompare(b));
317
- * // readonly ['apple', 'banana', 'cherry']
318
- *
319
- * // Mixed types require explicit comparator
320
- * const mixed = [3, '2', 1, '4'] as const;
321
- * const mixedSorted = Tpl.toSorted(mixed, (a, b) => Number(a) - Number(b));
322
- * // readonly ['1', '2', '3', '4'] but typed as (3 | '2' | 1 | '4')[]
323
- *
324
- * // Note: Element types become union of all elements
325
- * type Original = readonly [1, 2, 3];
326
- * type Sorted = { readonly [K in keyof Original]: Original[number] };
327
- * // Sorted = readonly [1 | 2 | 3, 1 | 2 | 3, 1 | 2 | 3]
328
- * ```
329
- */
330
- Tpl.toSorted = ((tpl, comparator) => {
331
- const cmp = comparator ?? ((x, y) => Number(x) - Number(y));
332
- return tpl.toSorted(cmp);
333
- });
334
- /**
335
- * Sorts a tuple by derived values from its elements.
336
- *
337
- * Allows sorting complex objects by extracting a sortable value from each.
338
- * Like `toSorted`, this preserves tuple length but element types become
339
- * a union of all possible elements.
340
- *
341
- * @template T - The tuple type to sort
342
- * @template B - The type of values used for comparison
343
- * @param tpl - The input tuple
344
- * @param comparatorValueMapper - Function to extract comparison value from each element
345
- * @param comparator - Optional comparator for the extracted values
346
- * @returns A new sorted tuple
347
- *
348
- * @example
349
- * ```typescript
350
- * // Sort objects by numeric property
351
- * const users = [
352
- * {name: 'Alice', age: 30},
353
- * {name: 'Bob', age: 20},
354
- * {name: 'Charlie', age: 25}
355
- * ] as const;
356
- * const byAge = Tpl.toSortedBy(users, (user) => user.age);
357
- * // [{name: 'Bob', age: 20}, {name: 'Charlie', age: 25}, {name: 'Alice', age: 30}]
358
- *
359
- * // Sort by string property with custom comparator
360
- * const byNameDesc = Tpl.toSortedBy(
361
- * users,
362
- * (user) => user.name,
363
- * (a, b) => b.localeCompare(a)
364
- * );
365
- * // Sorted by name in descending order
366
- *
367
- * // Sort by computed values
368
- * const points = [{x: 3, y: 4}, {x: 1, y: 1}, {x: 2, y: 2}] as const;
369
- * const byDistance = Tpl.toSortedBy(
370
- * points,
371
- * (p) => Math.sqrt(p.x ** 2 + p.y ** 2)
372
- * );
373
- * // Sorted by distance from origin
374
- *
375
- * // Custom comparator for complex sorting
376
- * const items = [{priority: 1, name: 'A'}, {priority: 1, name: 'B'}] as const;
377
- * const sorted = Tpl.toSortedBy(
378
- * items,
379
- * (item) => item.priority,
380
- * (a, b) => b - a // High priority first
381
- * );
382
- * ```
383
- */
384
- Tpl.toSortedBy = ((tpl, comparatorValueMapper, comparator) => Tpl.toSorted(tpl, (x, y) => comparator === undefined
385
- ? comparatorValueMapper(x) -
386
- comparatorValueMapper(y)
387
- : comparator(comparatorValueMapper(x), comparatorValueMapper(y))));
388
- })(Tpl || (Tpl = {}));
389
-
390
- export { Tpl };
391
- //# sourceMappingURL=tuple-utils.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tuple-utils.mjs","sources":["../../src/array/tuple-utils.mts"],"sourcesContent":[null],"names":[],"mappings":"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"}