@oscarpalmer/atoms 0.77.0 → 0.77.2

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 (54) hide show
  1. package/dist/js/array/chunk.cjs +1 -1
  2. package/dist/js/array/chunk.js +1 -1
  3. package/dist/js/value/equal.cjs +4 -1
  4. package/dist/js/value/equal.js +4 -1
  5. package/package.json +1 -1
  6. package/src/js/array/chunk.ts +1 -1
  7. package/src/js/array/count.ts +6 -6
  8. package/src/js/array/exists.ts +6 -6
  9. package/src/js/array/filter.ts +6 -6
  10. package/src/js/array/find.ts +6 -6
  11. package/src/js/array/group-by.ts +67 -55
  12. package/src/js/array/index-of.ts +6 -6
  13. package/src/js/array/sort.ts +20 -0
  14. package/src/js/array/to-map.ts +55 -47
  15. package/src/js/array/to-record.ts +61 -57
  16. package/src/js/array/unique.ts +6 -6
  17. package/src/js/internal/value/handle.ts +5 -5
  18. package/src/js/value/clone.ts +3 -1
  19. package/src/js/value/equal.ts +4 -1
  20. package/src/js/value/get.ts +9 -9
  21. package/src/js/value/set.ts +10 -11
  22. package/types/array/count.d.cts +34 -2
  23. package/types/array/count.d.ts +3 -3
  24. package/types/array/exists.d.cts +34 -2
  25. package/types/array/exists.d.ts +3 -3
  26. package/types/array/filter.d.cts +34 -2
  27. package/types/array/filter.d.ts +3 -3
  28. package/types/array/find.d.cts +34 -2
  29. package/types/array/find.d.ts +3 -3
  30. package/types/array/group-by.d.cts +44 -12
  31. package/types/array/group-by.d.ts +14 -14
  32. package/types/array/index-of.d.cts +34 -2
  33. package/types/array/index-of.d.ts +3 -3
  34. package/types/array/index.d.cts +88 -46
  35. package/types/array/sort.d.cts +42 -0
  36. package/types/array/sort.d.ts +11 -1
  37. package/types/array/to-map.d.cts +42 -10
  38. package/types/array/to-map.d.ts +13 -13
  39. package/types/array/to-record.d.cts +44 -12
  40. package/types/array/to-record.d.ts +13 -13
  41. package/types/array/unique.d.cts +34 -2
  42. package/types/array/unique.d.ts +3 -3
  43. package/types/index.d.cts +1034 -317
  44. package/types/internal/value/handle.d.cts +27 -2
  45. package/types/internal/value/handle.d.ts +2 -2
  46. package/types/models.d.cts +467 -210
  47. package/types/value/clone.d.cts +1 -1
  48. package/types/value/clone.d.ts +1 -1
  49. package/types/value/get.d.cts +470 -211
  50. package/types/value/get.d.ts +3 -3
  51. package/types/value/index.d.cts +515 -224
  52. package/types/value/set.d.cts +357 -170
  53. package/types/value/set.d.ts +3 -3
  54. package/types/value/smush.d.cts +463 -209
@@ -5,7 +5,14 @@ Matches any [primitive value](https://developer.mozilla.org/en-US/docs/Glossary/
5
5
 
6
6
  @category Type
7
7
  */
8
- export type Primitive = null | undefined | string | number | boolean | symbol | bigint;
8
+ export type Primitive =
9
+ | null
10
+ | undefined
11
+ | string
12
+ | number
13
+ | boolean
14
+ | symbol
15
+ | bigint;
9
16
  declare const emptyObjectSymbol: unique symbol;
10
17
  /**
11
18
  Represents a strictly empty plain object, the `{}` value.
@@ -62,7 +69,11 @@ type Includes<Value extends readonly any[], Item> =
62
69
  @category Type Guard
63
70
  @category Utilities
64
71
  */
65
- export type IsEqual<A, B> = (<G>() => G extends A ? 1 : 2) extends (<G>() => G extends B ? 1 : 2) ? true : false;
72
+ export type IsEqual<A, B> = (<G>() => G extends A ? 1 : 2) extends <
73
+ G,
74
+ >() => G extends B ? 1 : 2
75
+ ? true
76
+ : false;
66
77
  /**
67
78
  Represents an object with `unknown` value. You probably want this instead of `{}`.
68
79
 
@@ -129,14 +140,16 @@ type B = StaticPartOfArray<A>;
129
140
  //=> [string, number, boolean]
130
141
  ```
131
142
  */
132
- export type StaticPartOfArray<T extends UnknownArray, Result extends UnknownArray = [
133
- ]> = T extends unknown ? number extends T["length"] ? T extends readonly [
134
- infer U,
135
- ...infer V
136
- ] ? StaticPartOfArray<V, [
137
- ...Result,
138
- U
139
- ]> : Result : T : never; // Should never happen
143
+ export type StaticPartOfArray<
144
+ T extends UnknownArray,
145
+ Result extends UnknownArray = [],
146
+ > = T extends unknown
147
+ ? number extends T['length']
148
+ ? T extends readonly [infer U, ...infer V]
149
+ ? StaticPartOfArray<V, [...Result, U]>
150
+ : Result
151
+ : T
152
+ : never; // Should never happen
140
153
  /**
141
154
  Returns the variable, non-fixed-length portion of the given array, excluding static-length parts.
142
155
 
@@ -147,11 +160,11 @@ type B = VariablePartOfArray<A>;
147
160
  //=> string[]
148
161
  ```
149
162
  */
150
- export type VariablePartOfArray<T extends UnknownArray> = T extends unknown ? T extends readonly [
151
- ...StaticPartOfArray<T>,
152
- ...infer U
153
- ] ? U : [
154
- ] : never; // Should never happen
163
+ export type VariablePartOfArray<T extends UnknownArray> = T extends unknown
164
+ ? T extends readonly [...StaticPartOfArray<T>, ...infer U]
165
+ ? U
166
+ : []
167
+ : never; // Should never happen
155
168
  /**
156
169
  Returns a boolean for whether the given type is `any`.
157
170
 
@@ -194,7 +207,7 @@ Please upvote [this issue](https://github.com/microsoft/TypeScript/issues/32277)
194
207
  */
195
208
  // See https://github.com/microsoft/TypeScript/issues/31752
196
209
  // eslint-disable-next-line @typescript-eslint/no-loss-of-precision
197
- export type PositiveInfinity = Infinity;
210
+ export type PositiveInfinity = 1e999;
198
211
  /**
199
212
  Matches the hidden `-Infinity` type.
200
213
 
@@ -206,7 +219,7 @@ Please upvote [this issue](https://github.com/microsoft/TypeScript/issues/32277)
206
219
  */
207
220
  // See https://github.com/microsoft/TypeScript/issues/31752
208
221
  // eslint-disable-next-line @typescript-eslint/no-loss-of-precision
209
- export type NegativeInfinity = -Infinity;
222
+ export type NegativeInfinity = -1e999;
210
223
  /**
211
224
  A negative `number`/`bigint` (`-∞ < x < 0`)
212
225
 
@@ -217,7 +230,11 @@ Use-case: Validating and documenting parameters.
217
230
 
218
231
  @category Numeric
219
232
  */
220
- export type Negative<T extends Numeric> = T extends Zero ? never : `${T}` extends `-${string}` ? T : never;
233
+ export type Negative<T extends Numeric> = T extends Zero
234
+ ? never
235
+ : `${T}` extends `-${string}`
236
+ ? T
237
+ : never;
221
238
  /**
222
239
  Returns a boolean for whether the given number is a negative number.
223
240
 
@@ -233,7 +250,9 @@ type ShouldBeTrue = IsNegative<-1>;
233
250
 
234
251
  @category Numeric
235
252
  */
236
- export type IsNegative<T extends Numeric> = T extends Negative<T> ? true : false;
253
+ export type IsNegative<T extends Numeric> = T extends Negative<T>
254
+ ? true
255
+ : false;
237
256
  /**
238
257
  Returns a boolean for whether two given types are both true.
239
258
 
@@ -254,11 +273,12 @@ And<true, false>;
254
273
  */
255
274
  export type And<A extends boolean, B extends boolean> = [
256
275
  A,
257
- B
258
- ][number] extends true ? true : true extends [
259
- IsEqual<A, false>,
260
- IsEqual<B, false>
261
- ][number] ? false : never;
276
+ B,
277
+ ][number] extends true
278
+ ? true
279
+ : true extends [IsEqual<A, false>, IsEqual<B, false>][number]
280
+ ? false
281
+ : never;
262
282
  /**
263
283
  Returns a boolean for whether either of two given types are true.
264
284
 
@@ -279,11 +299,12 @@ Or<false, false>;
279
299
  */
280
300
  export type Or<A extends boolean, B extends boolean> = [
281
301
  A,
282
- B
283
- ][number] extends false ? false : true extends [
284
- IsEqual<A, true>,
285
- IsEqual<B, true>
286
- ][number] ? true : never;
302
+ B,
303
+ ][number] extends false
304
+ ? false
305
+ : true extends [IsEqual<A, true>, IsEqual<B, true>][number]
306
+ ? true
307
+ : never;
287
308
  /**
288
309
  Returns a boolean for whether a given number is greater than another number.
289
310
 
@@ -301,32 +322,44 @@ GreaterThan<1, 5>;
301
322
  //=> false
302
323
  ```
303
324
  */
304
- export type GreaterThan<A extends number, B extends number> = number extends A | B ? never : [
305
- IsEqual<A, PositiveInfinity>,
306
- IsEqual<A, NegativeInfinity>,
307
- IsEqual<B, PositiveInfinity>,
308
- IsEqual<B, NegativeInfinity>
309
- ] extends infer R extends [
310
- boolean,
311
- boolean,
312
- boolean,
313
- boolean
314
- ] ? Or<And<IsEqual<R[0], true>, IsEqual<R[2], false>>, And<IsEqual<R[3], true>, IsEqual<R[1], false>>> extends true ? true : Or<And<IsEqual<R[1], true>, IsEqual<R[3], false>>, And<IsEqual<R[2], true>, IsEqual<R[0], false>>> extends true ? false : true extends R[number] ? false : [
315
- IsNegative<A>,
316
- IsNegative<B>
317
- ] extends infer R extends [
318
- boolean,
319
- boolean
320
- ] ? [
321
- true,
322
- false
323
- ] extends R ? false : [
324
- false,
325
- true
326
- ] extends R ? true : [
327
- false,
328
- false
329
- ] extends R ? PositiveNumericStringGt<`${A}`, `${B}`> : PositiveNumericStringGt<`${NumberAbsolute<B>}`, `${NumberAbsolute<A>}`> : never : never;
325
+ export type GreaterThan<A extends number, B extends number> = number extends
326
+ | A
327
+ | B
328
+ ? never
329
+ : [
330
+ IsEqual<A, PositiveInfinity>,
331
+ IsEqual<A, NegativeInfinity>,
332
+ IsEqual<B, PositiveInfinity>,
333
+ IsEqual<B, NegativeInfinity>,
334
+ ] extends infer R extends [boolean, boolean, boolean, boolean]
335
+ ? Or<
336
+ And<IsEqual<R[0], true>, IsEqual<R[2], false>>,
337
+ And<IsEqual<R[3], true>, IsEqual<R[1], false>>
338
+ > extends true
339
+ ? true
340
+ : Or<
341
+ And<IsEqual<R[1], true>, IsEqual<R[3], false>>,
342
+ And<IsEqual<R[2], true>, IsEqual<R[0], false>>
343
+ > extends true
344
+ ? false
345
+ : true extends R[number]
346
+ ? false
347
+ : [IsNegative<A>, IsNegative<B>] extends infer R extends [
348
+ boolean,
349
+ boolean,
350
+ ]
351
+ ? [true, false] extends R
352
+ ? false
353
+ : [false, true] extends R
354
+ ? true
355
+ : [false, false] extends R
356
+ ? PositiveNumericStringGt<`${A}`, `${B}`>
357
+ : PositiveNumericStringGt<
358
+ `${NumberAbsolute<B>}`,
359
+ `${NumberAbsolute<A>}`
360
+ >
361
+ : never
362
+ : never;
330
363
  /**
331
364
  Returns a boolean for whether a given number is greater than or equal to another number.
332
365
 
@@ -344,7 +377,10 @@ GreaterThanOrEqual<1, 5>;
344
377
  //=> false
345
378
  ```
346
379
  */
347
- export type GreaterThanOrEqual<A extends number, B extends number> = number extends A | B ? never : A extends B ? true : GreaterThan<A, B>;
380
+ export type GreaterThanOrEqual<
381
+ A extends number,
382
+ B extends number,
383
+ > = number extends A | B ? never : A extends B ? true : GreaterThan<A, B>;
348
384
  /**
349
385
  Returns a boolean for whether a given number is less than another number.
350
386
 
@@ -362,7 +398,11 @@ LessThan<1, 5>;
362
398
  //=> true
363
399
  ```
364
400
  */
365
- export type LessThan<A extends number, B extends number> = number extends A | B ? never : GreaterThanOrEqual<A, B> extends true ? false : true;
401
+ export type LessThan<A extends number, B extends number> = number extends A | B
402
+ ? never
403
+ : GreaterThanOrEqual<A, B> extends true
404
+ ? false
405
+ : true;
366
406
  /**
367
407
  Create a tuple type of the given length `<L>` and fill it with the given type `<Fill>`.
368
408
 
@@ -370,11 +410,11 @@ If `<Fill>` is not provided, it will default to `unknown`.
370
410
 
371
411
  @link https://itnext.io/implementing-arithmetic-within-typescripts-type-system-a1ef140a6f6f
372
412
  */
373
- export type BuildTuple<L extends number, Fill = unknown, T extends readonly unknown[] = [
374
- ]> = T["length"] extends L ? T : BuildTuple<L, Fill, [
375
- ...T,
376
- Fill
377
- ]>;
413
+ export type BuildTuple<
414
+ L extends number,
415
+ Fill = unknown,
416
+ T extends readonly unknown[] = [],
417
+ > = T['length'] extends L ? T : BuildTuple<L, Fill, [...T, Fill]>;
378
418
  /**
379
419
  Returns the maximum value from a tuple of integers.
380
420
 
@@ -390,10 +430,16 @@ ArrayMax<[1, 2, 5, 3, 99, -1]>;
390
430
  //=> 99
391
431
  ```
392
432
  */
393
- export type TupleMax<A extends number[], Result extends number = NegativeInfinity> = number extends A[number] ? never : A extends [
394
- infer F extends number,
395
- ...infer R extends number[]
396
- ] ? GreaterThan<F, Result> extends true ? TupleMax<R, F> : TupleMax<R, Result> : Result;
433
+ export type TupleMax<
434
+ A extends number[],
435
+ Result extends number = NegativeInfinity,
436
+ > = number extends A[number]
437
+ ? never
438
+ : A extends [infer F extends number, ...infer R extends number[]]
439
+ ? GreaterThan<F, Result> extends true
440
+ ? TupleMax<R, F>
441
+ : TupleMax<R, Result>
442
+ : Result;
397
443
  /**
398
444
  Returns the minimum value from a tuple of integers.
399
445
 
@@ -409,10 +455,16 @@ ArrayMin<[1, 2, 5, 3, -5]>;
409
455
  //=> -5
410
456
  ```
411
457
  */
412
- export type TupleMin<A extends number[], Result extends number = PositiveInfinity> = number extends A[number] ? never : A extends [
413
- infer F extends number,
414
- ...infer R extends number[]
415
- ] ? LessThan<F, Result> extends true ? TupleMin<R, F> : TupleMin<R, Result> : Result;
458
+ export type TupleMin<
459
+ A extends number[],
460
+ Result extends number = PositiveInfinity,
461
+ > = number extends A[number]
462
+ ? never
463
+ : A extends [infer F extends number, ...infer R extends number[]]
464
+ ? LessThan<F, Result> extends true
465
+ ? TupleMin<R, F>
466
+ : TupleMin<R, Result>
467
+ : Result;
416
468
  /**
417
469
  Return a string representation of the given string or number.
418
470
 
@@ -447,7 +499,14 @@ type NegativeInfinity = StringToNumber<'-Infinity'>;
447
499
  @category Numeric
448
500
  @category Template literal
449
501
  */
450
- export type StringToNumber<S extends string> = S extends `${infer N extends number}` ? N : S extends "Infinity" ? PositiveInfinity : S extends "-Infinity" ? NegativeInfinity : never;
502
+ export type StringToNumber<S extends string> =
503
+ S extends `${infer N extends number}`
504
+ ? N
505
+ : S extends 'Infinity'
506
+ ? PositiveInfinity
507
+ : S extends '-Infinity'
508
+ ? NegativeInfinity
509
+ : never;
451
510
  /**
452
511
  Returns an array of the characters of the string.
453
512
 
@@ -462,11 +521,14 @@ StringToArray<string>;
462
521
 
463
522
  @category String
464
523
  */
465
- export type StringToArray<S extends string, Result extends string[] = [
466
- ]> = string extends S ? never : S extends `${infer F}${infer R}` ? StringToArray<R, [
467
- ...Result,
468
- F
469
- ]> : Result;
524
+ export type StringToArray<
525
+ S extends string,
526
+ Result extends string[] = [],
527
+ > = string extends S
528
+ ? never
529
+ : S extends `${infer F}${infer R}`
530
+ ? StringToArray<R, [...Result, F]>
531
+ : Result;
470
532
  /**
471
533
  Returns the length of the given string.
472
534
 
@@ -482,7 +544,9 @@ StringLength<string>;
482
544
  @category String
483
545
  @category Template literal
484
546
  */
485
- export type StringLength<S extends string> = string extends S ? never : StringToArray<S>["length"];
547
+ export type StringLength<S extends string> = string extends S
548
+ ? never
549
+ : StringToArray<S>['length'];
486
550
  /**
487
551
  Returns a boolean for whether `A` represents a number greater than `B`, where `A` and `B` are both numeric strings and have the same length.
488
552
 
@@ -495,8 +559,17 @@ SameLengthPositiveNumericStringGt<'10', '10'>;
495
559
  //=> false
496
560
  ```
497
561
  */
498
- export type SameLengthPositiveNumericStringGt<A extends string, B extends string> = A extends `${infer FirstA}${infer RestA}` ? B extends `${infer FirstB}${infer RestB}` ? FirstA extends FirstB ? SameLengthPositiveNumericStringGt<RestA, RestB> : PositiveNumericCharacterGt<FirstA, FirstB> : never : false;
499
- export type NumericString = "0123456789";
562
+ export type SameLengthPositiveNumericStringGt<
563
+ A extends string,
564
+ B extends string,
565
+ > = A extends `${infer FirstA}${infer RestA}`
566
+ ? B extends `${infer FirstB}${infer RestB}`
567
+ ? FirstA extends FirstB
568
+ ? SameLengthPositiveNumericStringGt<RestA, RestB>
569
+ : PositiveNumericCharacterGt<FirstA, FirstB>
570
+ : never
571
+ : false;
572
+ export type NumericString = '0123456789';
500
573
  /**
501
574
  Returns a boolean for whether `A` is greater than `B`, where `A` and `B` are both positive numeric strings.
502
575
 
@@ -512,16 +585,21 @@ PositiveNumericStringGt<'1', '500'>;
512
585
  //=> false
513
586
  ```
514
587
  */
515
- export type PositiveNumericStringGt<A extends string, B extends string> = A extends B ? false : [
516
- BuildTuple<StringLength<A>, 0>,
517
- BuildTuple<StringLength<B>, 0>
518
- ] extends infer R extends [
519
- readonly unknown[],
520
- readonly unknown[]
521
- ] ? R[0] extends [
522
- ...R[1],
523
- ...infer Remain extends readonly unknown[]
524
- ] ? 0 extends Remain["length"] ? SameLengthPositiveNumericStringGt<A, B> : true : false : never;
588
+ export type PositiveNumericStringGt<
589
+ A extends string,
590
+ B extends string,
591
+ > = A extends B
592
+ ? false
593
+ : [
594
+ BuildTuple<StringLength<A>, 0>,
595
+ BuildTuple<StringLength<B>, 0>,
596
+ ] extends infer R extends [readonly unknown[], readonly unknown[]]
597
+ ? R[0] extends [...R[1], ...infer Remain extends readonly unknown[]]
598
+ ? 0 extends Remain['length']
599
+ ? SameLengthPositiveNumericStringGt<A, B>
600
+ : true
601
+ : false
602
+ : never;
525
603
  /**
526
604
  Returns a boolean for whether `A` represents a number greater than `B`, where `A` and `B` are both positive numeric characters.
527
605
 
@@ -534,7 +612,16 @@ PositiveNumericCharacterGt<'1', '1'>;
534
612
  //=> false
535
613
  ```
536
614
  */
537
- export type PositiveNumericCharacterGt<A extends string, B extends string> = NumericString extends `${infer HeadA}${A}${infer TailA}` ? NumericString extends `${infer HeadB}${B}${infer TailB}` ? HeadA extends `${HeadB}${infer _}${infer __}` ? true : false : never : never;
615
+ export type PositiveNumericCharacterGt<
616
+ A extends string,
617
+ B extends string,
618
+ > = NumericString extends `${infer HeadA}${A}${infer TailA}`
619
+ ? NumericString extends `${infer HeadB}${B}${infer TailB}`
620
+ ? HeadA extends `${HeadB}${infer _}${infer __}`
621
+ ? true
622
+ : false
623
+ : never
624
+ : never;
538
625
  /**
539
626
  Returns the absolute value of a given value.
540
627
 
@@ -550,7 +637,10 @@ NumberAbsolute<NegativeInfinity>
550
637
  //=> PositiveInfinity
551
638
  ```
552
639
  */
553
- export type NumberAbsolute<N extends number> = `${N}` extends `-${infer StringPositiveN}` ? StringToNumber<StringPositiveN> : N;
640
+ export type NumberAbsolute<N extends number> =
641
+ `${N}` extends `-${infer StringPositiveN}`
642
+ ? StringToNumber<StringPositiveN>
643
+ : N;
554
644
  /**
555
645
  Check whether the given type is a number or a number string.
556
646
 
@@ -570,7 +660,13 @@ type C = IsNumberLike<1>;
570
660
  type D = IsNumberLike<'a'>;
571
661
  //=> false
572
662
  */
573
- export type IsNumberLike<N> = N extends number ? true : N extends `${number}` ? true : N extends `${number}.${number}` ? true : false;
663
+ export type IsNumberLike<N> = N extends number
664
+ ? true
665
+ : N extends `${number}`
666
+ ? true
667
+ : N extends `${number}.${number}`
668
+ ? true
669
+ : false;
574
670
  /**
575
671
  Matches any primitive, `void`, `Date`, or `RegExp` value.
576
672
  */
@@ -578,7 +674,12 @@ export type BuiltIns = Primitive | void | Date | RegExp;
578
674
  /**
579
675
  Matches non-recursive types.
580
676
  */
581
- export type NonRecursiveType = BuiltIns | Function | (new (...arguments_: any[]) => unknown);
677
+ export type NonRecursiveType =
678
+ | BuiltIns
679
+ | Function
680
+ | (new (
681
+ ...arguments_: any[]
682
+ ) => unknown);
582
683
  /**
583
684
  Returns the sum of two numbers.
584
685
 
@@ -610,35 +711,45 @@ Sum<PositiveInfinity, NegativeInfinity>;
610
711
  @category Numeric
611
712
  */
612
713
  // TODO: Support big integer and negative number.
613
- export type Sum<A extends number, B extends number> = number extends A | B ? number : [
614
- IsEqual<A, PositiveInfinity>,
615
- IsEqual<A, NegativeInfinity>,
616
- IsEqual<B, PositiveInfinity>,
617
- IsEqual<B, NegativeInfinity>
618
- ] extends infer R extends [
619
- boolean,
620
- boolean,
621
- boolean,
622
- boolean
623
- ] ? Or<And<IsEqual<R[0], true>, IsEqual<R[3], false>>, And<IsEqual<R[2], true>, IsEqual<R[1], false>>> extends true ? PositiveInfinity : Or<And<IsEqual<R[1], true>, IsEqual<R[2], false>>, And<IsEqual<R[3], true>, IsEqual<R[0], false>>> extends true ? NegativeInfinity : true extends R[number] ? number : ([
624
- IsNegative<A>,
625
- IsNegative<B>
626
- ] extends infer R ? [
627
- false,
628
- false
629
- ] extends R ? [
630
- ...BuildTuple<A>,
631
- ...BuildTuple<B>
632
- ]["length"] : [
633
- true,
634
- true
635
- ] extends R ? number : TupleMax<[
636
- NumberAbsolute<A>,
637
- NumberAbsolute<B>
638
- ]> extends infer Max_ ? TupleMin<[
639
- NumberAbsolute<A>,
640
- NumberAbsolute<B>
641
- ]> extends infer Min_ extends number ? Max_ extends A | B ? Subtract<Max_, Min_> : number : never : never : never) & number : never;
714
+ export type Sum<A extends number, B extends number> = number extends A | B
715
+ ? number
716
+ : [
717
+ IsEqual<A, PositiveInfinity>,
718
+ IsEqual<A, NegativeInfinity>,
719
+ IsEqual<B, PositiveInfinity>,
720
+ IsEqual<B, NegativeInfinity>,
721
+ ] extends infer R extends [boolean, boolean, boolean, boolean]
722
+ ? Or<
723
+ And<IsEqual<R[0], true>, IsEqual<R[3], false>>,
724
+ And<IsEqual<R[2], true>, IsEqual<R[1], false>>
725
+ > extends true
726
+ ? PositiveInfinity
727
+ : Or<
728
+ And<IsEqual<R[1], true>, IsEqual<R[2], false>>,
729
+ And<IsEqual<R[3], true>, IsEqual<R[0], false>>
730
+ > extends true
731
+ ? NegativeInfinity
732
+ : true extends R[number]
733
+ ? number
734
+ : ([IsNegative<A>, IsNegative<B>] extends infer R
735
+ ? [false, false] extends R
736
+ ? [...BuildTuple<A>, ...BuildTuple<B>]['length']
737
+ : [true, true] extends R
738
+ ? number
739
+ : TupleMax<
740
+ [NumberAbsolute<A>, NumberAbsolute<B>]
741
+ > extends infer Max_
742
+ ? TupleMin<
743
+ [NumberAbsolute<A>, NumberAbsolute<B>]
744
+ > extends infer Min_ extends number
745
+ ? Max_ extends A | B
746
+ ? Subtract<Max_, Min_>
747
+ : number
748
+ : never
749
+ : never
750
+ : never) &
751
+ number
752
+ : never;
642
753
  /**
643
754
  Returns the difference between two numbers.
644
755
 
@@ -669,29 +780,40 @@ Subtract<PositiveInfinity, PositiveInfinity>;
669
780
  @category Numeric
670
781
  */
671
782
  // TODO: Support big integer and negative number.
672
- export type Subtract<A extends number, B extends number> = number extends A | B ? number : [
673
- IsEqual<A, PositiveInfinity>,
674
- IsEqual<A, NegativeInfinity>,
675
- IsEqual<B, PositiveInfinity>,
676
- IsEqual<B, NegativeInfinity>
677
- ] extends infer R extends [
678
- boolean,
679
- boolean,
680
- boolean,
681
- boolean
682
- ] ? Or<And<IsEqual<R[0], true>, IsEqual<R[2], false>>, And<IsEqual<R[3], true>, IsEqual<R[1], false>>> extends true ? PositiveInfinity : Or<And<IsEqual<R[1], true>, IsEqual<R[3], false>>, And<IsEqual<R[2], true>, IsEqual<R[0], false>>> extends true ? NegativeInfinity : true extends R[number] ? number : [
683
- IsNegative<A>,
684
- IsNegative<B>
685
- ] extends infer R ? [
686
- false,
687
- false
688
- ] extends R ? BuildTuple<A> extends infer R ? R extends [
689
- ...BuildTuple<B>,
690
- ...infer R
691
- ] ? R["length"] : number : never : LessThan<A, B> extends true ? number : [
692
- false,
693
- true
694
- ] extends R ? Sum<A, NumberAbsolute<B>> : Subtract<NumberAbsolute<B>, NumberAbsolute<A>> : never : never;
783
+ export type Subtract<A extends number, B extends number> = number extends A | B
784
+ ? number
785
+ : [
786
+ IsEqual<A, PositiveInfinity>,
787
+ IsEqual<A, NegativeInfinity>,
788
+ IsEqual<B, PositiveInfinity>,
789
+ IsEqual<B, NegativeInfinity>,
790
+ ] extends infer R extends [boolean, boolean, boolean, boolean]
791
+ ? Or<
792
+ And<IsEqual<R[0], true>, IsEqual<R[2], false>>,
793
+ And<IsEqual<R[3], true>, IsEqual<R[1], false>>
794
+ > extends true
795
+ ? PositiveInfinity
796
+ : Or<
797
+ And<IsEqual<R[1], true>, IsEqual<R[3], false>>,
798
+ And<IsEqual<R[2], true>, IsEqual<R[0], false>>
799
+ > extends true
800
+ ? NegativeInfinity
801
+ : true extends R[number]
802
+ ? number
803
+ : [IsNegative<A>, IsNegative<B>] extends infer R
804
+ ? [false, false] extends R
805
+ ? BuildTuple<A> extends infer R
806
+ ? R extends [...BuildTuple<B>, ...infer R]
807
+ ? R['length']
808
+ : number
809
+ : never
810
+ : LessThan<A, B> extends true
811
+ ? number
812
+ : [false, true] extends R
813
+ ? Sum<A, NumberAbsolute<B>>
814
+ : Subtract<NumberAbsolute<B>, NumberAbsolute<A>>
815
+ : never
816
+ : never;
695
817
  /**
696
818
  Paths options.
697
819
 
@@ -782,36 +904,96 @@ open('listB.1'); // TypeError. Because listB only has one element.
782
904
  @category Object
783
905
  @category Array
784
906
  */
785
- export type Paths<T, Options extends PathsOptions = {}> = _Paths<T, {
786
- // Set default maxRecursionDepth to 10
787
- maxRecursionDepth: Options["maxRecursionDepth"] extends number ? Options["maxRecursionDepth"] : DefaultPathsOptions["maxRecursionDepth"];
788
- // Set default bracketNotation to false
789
- bracketNotation: Options["bracketNotation"] extends boolean ? Options["bracketNotation"] : DefaultPathsOptions["bracketNotation"];
790
- }>;
791
- export type _Paths<T, Options extends Required<PathsOptions>> = T extends NonRecursiveType | ReadonlyMap<unknown, unknown> | ReadonlySet<unknown> ? never : IsAny<T> extends true ? never : T extends UnknownArray ? number extends T["length"] ? InternalPaths<StaticPartOfArray<T>, Options> | InternalPaths<Array<VariablePartOfArray<T>[number]>, Options> : InternalPaths<T, Options> : T extends object ? InternalPaths<T, Options> : never;
792
- export type InternalPaths<T, Options extends Required<PathsOptions>> = Options["maxRecursionDepth"] extends infer MaxDepth extends number ? Required<T> extends infer T ? T extends EmptyObject | readonly [
793
- ] ? never : {
794
- [Key in keyof T]: Key extends string | number // Limit `Key` to string or number.
795
- ? (Options["bracketNotation"] extends true ? IsNumberLike<Key> extends true ? `[${Key}]` : (Key | ToString<Key>) : never | Options["bracketNotation"] extends false ? (Key | ToString<Key>) : never) extends infer TranformedKey extends string | number ?
796
- // 1. If style is 'a[0].b' and 'Key' is a numberlike value like 3 or '3', transform 'Key' to `[${Key}]`, else to `${Key}` | Key
797
- // 2. If style is 'a.0.b', transform 'Key' to `${Key}` | Key
798
- TranformedKey | (
799
- // Recursively generate paths for the current key
800
- GreaterThan<MaxDepth, 0> extends true // Limit the depth to prevent infinite recursion
801
- ? _Paths<T[Key], {
802
- bracketNotation: Options["bracketNotation"];
803
- maxRecursionDepth: Subtract<MaxDepth, 1>;
804
- }> extends infer SubPath ? SubPath extends string | number ? (Options["bracketNotation"] extends true ? SubPath extends `[${any}]` | `[${any}]${string}` ? `${TranformedKey}${SubPath}` // If next node is number key like `[3]`, no need to add `.` before it.
805
- : `${TranformedKey}.${SubPath}` : never) | (Options["bracketNotation"] extends false ? `${TranformedKey}.${SubPath}` : never) : never : never : never) : never : never;
806
- }[keyof T & (T extends UnknownArray ? number : unknown)] : never : never;
807
- export type PlainObject = UnknownRecord;
907
+ export type Paths<T, Options extends PathsOptions = {}> = _Paths<
908
+ T,
909
+ {
910
+ // Set default maxRecursionDepth to 10
911
+ maxRecursionDepth: Options['maxRecursionDepth'] extends number
912
+ ? Options['maxRecursionDepth']
913
+ : DefaultPathsOptions['maxRecursionDepth'];
914
+ // Set default bracketNotation to false
915
+ bracketNotation: Options['bracketNotation'] extends boolean
916
+ ? Options['bracketNotation']
917
+ : DefaultPathsOptions['bracketNotation'];
918
+ }
919
+ >;
920
+ export type _Paths<T, Options extends Required<PathsOptions>> = T extends
921
+ | NonRecursiveType
922
+ | ReadonlyMap<unknown, unknown>
923
+ | ReadonlySet<unknown>
924
+ ? never
925
+ : IsAny<T> extends true
926
+ ? never
927
+ : T extends UnknownArray
928
+ ? number extends T['length']
929
+ ?
930
+ | InternalPaths<StaticPartOfArray<T>, Options>
931
+ | InternalPaths<Array<VariablePartOfArray<T>[number]>, Options>
932
+ : InternalPaths<T, Options>
933
+ : T extends object
934
+ ? InternalPaths<T, Options>
935
+ : never;
936
+ export type InternalPaths<
937
+ T,
938
+ Options extends Required<PathsOptions>,
939
+ > = Options['maxRecursionDepth'] extends infer MaxDepth extends number
940
+ ? Required<T> extends infer T
941
+ ? T extends EmptyObject | readonly []
942
+ ? never
943
+ : {
944
+ [Key in keyof T]: Key extends string | number // Limit `Key` to string or number.
945
+ ? (
946
+ Options['bracketNotation'] extends true
947
+ ? IsNumberLike<Key> extends true
948
+ ? `[${Key}]`
949
+ : Key | ToString<Key>
950
+ : never | Options['bracketNotation'] extends false
951
+ ? Key | ToString<Key>
952
+ : never
953
+ ) extends infer TranformedKey extends string | number
954
+ ? // 1. If style is 'a[0].b' and 'Key' is a numberlike value like 3 or '3', transform 'Key' to `[${Key}]`, else to `${Key}` | Key
955
+ // 2. If style is 'a.0.b', transform 'Key' to `${Key}` | Key
956
+ | TranformedKey
957
+ // Recursively generate paths for the current key
958
+ | (GreaterThan<MaxDepth, 0> extends true // Limit the depth to prevent infinite recursion
959
+ ? _Paths<
960
+ T[Key],
961
+ {
962
+ bracketNotation: Options['bracketNotation'];
963
+ maxRecursionDepth: Subtract<MaxDepth, 1>;
964
+ }
965
+ > extends infer SubPath
966
+ ? SubPath extends string | number
967
+ ?
968
+ | (Options['bracketNotation'] extends true
969
+ ? SubPath extends
970
+ | `[${any}]`
971
+ | `[${any}]${string}`
972
+ ? `${TranformedKey}${SubPath}` // If next node is number key like `[3]`, no need to add `.` before it.
973
+ : `${TranformedKey}.${SubPath}`
974
+ : never)
975
+ | (Options['bracketNotation'] extends false
976
+ ? `${TranformedKey}.${SubPath}`
977
+ : never)
978
+ : never
979
+ : never
980
+ : never)
981
+ : never
982
+ : never;
983
+ }[keyof T & (T extends UnknownArray ? number : unknown)]
984
+ : never
985
+ : never;
986
+ export type ArrayOrPlainObject = UnknownArray | UnknownRecord;
808
987
  /**
809
988
  * - Set the value in an object using a known path
810
989
  * - You can set a nested value by using dot notation, e.g., `foo.bar.baz`
811
990
  * - If a part of the path does not exist, it will be created, either as an array or a generic object, depending on the path
812
991
  * - Returns the original object
813
992
  */
814
- export declare function setValue<Data extends PlainObject, Path extends Paths<Data>>(data: Data, path: Path, value: unknown): Data;
993
+ export declare function setValue<
994
+ Data extends ArrayOrPlainObject,
995
+ Path extends Paths<Data>,
996
+ >(data: Data, path: Path, value: unknown): Data;
815
997
  /**
816
998
  * - Set the value in an object using an unknown path
817
999
  * - You can set a nested value by using dot notation, e.g., `foo.bar.baz`
@@ -819,6 +1001,11 @@ export declare function setValue<Data extends PlainObject, Path extends Paths<Da
819
1001
  * - If `ignoreCase` is `true`, path matching will be case-insensitive
820
1002
  * - Returns the original object
821
1003
  */
822
- export declare function setValue<Data extends PlainObject>(data: Data, path: string, value: unknown, ignoreCase?: boolean): Data;
1004
+ export declare function setValue<Data extends ArrayOrPlainObject>(
1005
+ data: Data,
1006
+ path: string,
1007
+ value: unknown,
1008
+ ignoreCase?: boolean,
1009
+ ): Data;
823
1010
 
824
1011
  export {};