@oscarpalmer/atoms 0.76.0 → 0.77.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 (59) hide show
  1. package/dist/js/array/count.cjs +1 -8
  2. package/dist/js/array/count.js +1 -8
  3. package/dist/js/array/exists.cjs +1 -8
  4. package/dist/js/array/exists.js +1 -8
  5. package/dist/js/array/filter.cjs +1 -8
  6. package/dist/js/array/filter.js +1 -8
  7. package/dist/js/array/find.cjs +1 -8
  8. package/dist/js/array/find.js +1 -8
  9. package/dist/js/array/index-of.cjs +1 -8
  10. package/dist/js/array/index-of.js +1 -8
  11. package/dist/js/array/unique.cjs +1 -1
  12. package/dist/js/array/unique.js +1 -1
  13. package/dist/js/internal/array/find.cjs +12 -2
  14. package/dist/js/internal/array/find.js +12 -2
  15. package/package.json +11 -4
  16. package/src/js/array/count.ts +7 -20
  17. package/src/js/array/exists.ts +7 -22
  18. package/src/js/array/filter.ts +7 -20
  19. package/src/js/array/find.ts +7 -20
  20. package/src/js/array/group-by.ts +19 -21
  21. package/src/js/array/index-of.ts +7 -20
  22. package/src/js/array/models.ts +2 -16
  23. package/src/js/array/sort.ts +3 -7
  24. package/src/js/array/to-map.ts +19 -21
  25. package/src/js/array/to-record.ts +17 -19
  26. package/src/js/array/unique.ts +8 -8
  27. package/src/js/internal/array/callbacks.ts +4 -4
  28. package/src/js/internal/array/find.ts +29 -6
  29. package/types/array/count.d.cts +2 -5
  30. package/types/array/count.d.ts +3 -3
  31. package/types/array/exists.d.cts +2 -5
  32. package/types/array/exists.d.ts +3 -3
  33. package/types/array/filter.d.cts +2 -5
  34. package/types/array/filter.d.ts +3 -3
  35. package/types/array/find.d.cts +2 -5
  36. package/types/array/find.d.ts +3 -3
  37. package/types/array/group-by.d.cts +8 -11
  38. package/types/array/group-by.d.ts +10 -11
  39. package/types/array/index-of.d.cts +2 -5
  40. package/types/array/index-of.d.ts +3 -3
  41. package/types/array/index.d.cts +43 -48
  42. package/types/array/models.d.cts +2 -7
  43. package/types/array/models.d.ts +2 -7
  44. package/types/array/sort.d.cts +3 -4
  45. package/types/array/sort.d.ts +3 -3
  46. package/types/array/to-map.d.cts +8 -11
  47. package/types/array/to-map.d.ts +9 -10
  48. package/types/array/to-record.d.cts +8 -11
  49. package/types/array/to-record.d.ts +9 -10
  50. package/types/array/unique.d.cts +3 -5
  51. package/types/array/unique.d.ts +4 -4
  52. package/types/index.d.cts +321 -1019
  53. package/types/internal/array/find.d.cts +2 -2
  54. package/types/internal/array/find.d.ts +2 -2
  55. package/types/models.d.cts +210 -467
  56. package/types/value/get.d.cts +210 -469
  57. package/types/value/index.d.cts +223 -514
  58. package/types/value/set.d.cts +169 -356
  59. package/types/value/smush.d.cts +209 -463
@@ -5,14 +5,7 @@ Matches any [primitive value](https://developer.mozilla.org/en-US/docs/Glossary/
5
5
 
6
6
  @category Type
7
7
  */
8
- export type Primitive =
9
- | null
10
- | undefined
11
- | string
12
- | number
13
- | boolean
14
- | symbol
15
- | bigint;
8
+ export type Primitive = null | undefined | string | number | boolean | symbol | bigint;
16
9
  declare const emptyObjectSymbol: unique symbol;
17
10
  /**
18
11
  Represents a strictly empty plain object, the `{}` value.
@@ -69,11 +62,7 @@ type Includes<Value extends readonly any[], Item> =
69
62
  @category Type Guard
70
63
  @category Utilities
71
64
  */
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;
65
+ export type IsEqual<A, B> = (<G>() => G extends A ? 1 : 2) extends (<G>() => G extends B ? 1 : 2) ? true : false;
77
66
  /**
78
67
  Represents an object with `unknown` value. You probably want this instead of `{}`.
79
68
 
@@ -140,16 +129,14 @@ type B = StaticPartOfArray<A>;
140
129
  //=> [string, number, boolean]
141
130
  ```
142
131
  */
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
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
153
140
  /**
154
141
  Returns the variable, non-fixed-length portion of the given array, excluding static-length parts.
155
142
 
@@ -160,11 +147,11 @@ type B = VariablePartOfArray<A>;
160
147
  //=> string[]
161
148
  ```
162
149
  */
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
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
168
155
  /**
169
156
  Returns a boolean for whether the given type is `any`.
170
157
 
@@ -207,7 +194,7 @@ Please upvote [this issue](https://github.com/microsoft/TypeScript/issues/32277)
207
194
  */
208
195
  // See https://github.com/microsoft/TypeScript/issues/31752
209
196
  // eslint-disable-next-line @typescript-eslint/no-loss-of-precision
210
- export type PositiveInfinity = 1e999;
197
+ export type PositiveInfinity = Infinity;
211
198
  /**
212
199
  Matches the hidden `-Infinity` type.
213
200
 
@@ -219,7 +206,7 @@ Please upvote [this issue](https://github.com/microsoft/TypeScript/issues/32277)
219
206
  */
220
207
  // See https://github.com/microsoft/TypeScript/issues/31752
221
208
  // eslint-disable-next-line @typescript-eslint/no-loss-of-precision
222
- export type NegativeInfinity = -1e999;
209
+ export type NegativeInfinity = -Infinity;
223
210
  /**
224
211
  A negative `number`/`bigint` (`-∞ < x < 0`)
225
212
 
@@ -230,11 +217,7 @@ Use-case: Validating and documenting parameters.
230
217
 
231
218
  @category Numeric
232
219
  */
233
- export type Negative<T extends Numeric> = T extends Zero
234
- ? never
235
- : `${T}` extends `-${string}`
236
- ? T
237
- : never;
220
+ export type Negative<T extends Numeric> = T extends Zero ? never : `${T}` extends `-${string}` ? T : never;
238
221
  /**
239
222
  Returns a boolean for whether the given number is a negative number.
240
223
 
@@ -250,9 +233,7 @@ type ShouldBeTrue = IsNegative<-1>;
250
233
 
251
234
  @category Numeric
252
235
  */
253
- export type IsNegative<T extends Numeric> = T extends Negative<T>
254
- ? true
255
- : false;
236
+ export type IsNegative<T extends Numeric> = T extends Negative<T> ? true : false;
256
237
  /**
257
238
  Returns a boolean for whether two given types are both true.
258
239
 
@@ -273,12 +254,11 @@ And<true, false>;
273
254
  */
274
255
  export type And<A extends boolean, B extends boolean> = [
275
256
  A,
276
- B,
277
- ][number] extends true
278
- ? true
279
- : true extends [IsEqual<A, false>, IsEqual<B, false>][number]
280
- ? false
281
- : never;
257
+ B
258
+ ][number] extends true ? true : true extends [
259
+ IsEqual<A, false>,
260
+ IsEqual<B, false>
261
+ ][number] ? false : never;
282
262
  /**
283
263
  Returns a boolean for whether either of two given types are true.
284
264
 
@@ -299,12 +279,11 @@ Or<false, false>;
299
279
  */
300
280
  export type Or<A extends boolean, B extends boolean> = [
301
281
  A,
302
- B,
303
- ][number] extends false
304
- ? false
305
- : true extends [IsEqual<A, true>, IsEqual<B, true>][number]
306
- ? true
307
- : never;
282
+ B
283
+ ][number] extends false ? false : true extends [
284
+ IsEqual<A, true>,
285
+ IsEqual<B, true>
286
+ ][number] ? true : never;
308
287
  /**
309
288
  Returns a boolean for whether a given number is greater than another number.
310
289
 
@@ -322,44 +301,32 @@ GreaterThan<1, 5>;
322
301
  //=> false
323
302
  ```
324
303
  */
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;
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;
363
330
  /**
364
331
  Returns a boolean for whether a given number is greater than or equal to another number.
365
332
 
@@ -377,10 +344,7 @@ GreaterThanOrEqual<1, 5>;
377
344
  //=> false
378
345
  ```
379
346
  */
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>;
347
+ export type GreaterThanOrEqual<A extends number, B extends number> = number extends A | B ? never : A extends B ? true : GreaterThan<A, B>;
384
348
  /**
385
349
  Returns a boolean for whether a given number is less than another number.
386
350
 
@@ -398,11 +362,7 @@ LessThan<1, 5>;
398
362
  //=> true
399
363
  ```
400
364
  */
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;
365
+ export type LessThan<A extends number, B extends number> = number extends A | B ? never : GreaterThanOrEqual<A, B> extends true ? false : true;
406
366
  /**
407
367
  Create a tuple type of the given length `<L>` and fill it with the given type `<Fill>`.
408
368
 
@@ -410,11 +370,11 @@ If `<Fill>` is not provided, it will default to `unknown`.
410
370
 
411
371
  @link https://itnext.io/implementing-arithmetic-within-typescripts-type-system-a1ef140a6f6f
412
372
  */
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]>;
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
+ ]>;
418
378
  /**
419
379
  Returns the maximum value from a tuple of integers.
420
380
 
@@ -430,16 +390,10 @@ ArrayMax<[1, 2, 5, 3, 99, -1]>;
430
390
  //=> 99
431
391
  ```
432
392
  */
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;
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;
443
397
  /**
444
398
  Returns the minimum value from a tuple of integers.
445
399
 
@@ -455,16 +409,10 @@ ArrayMin<[1, 2, 5, 3, -5]>;
455
409
  //=> -5
456
410
  ```
457
411
  */
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;
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;
468
416
  /**
469
417
  Return a string representation of the given string or number.
470
418
 
@@ -499,14 +447,7 @@ type NegativeInfinity = StringToNumber<'-Infinity'>;
499
447
  @category Numeric
500
448
  @category Template literal
501
449
  */
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;
450
+ export type StringToNumber<S extends string> = S extends `${infer N extends number}` ? N : S extends "Infinity" ? PositiveInfinity : S extends "-Infinity" ? NegativeInfinity : never;
510
451
  /**
511
452
  Returns an array of the characters of the string.
512
453
 
@@ -521,14 +462,11 @@ StringToArray<string>;
521
462
 
522
463
  @category String
523
464
  */
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;
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;
532
470
  /**
533
471
  Returns the length of the given string.
534
472
 
@@ -544,9 +482,7 @@ StringLength<string>;
544
482
  @category String
545
483
  @category Template literal
546
484
  */
547
- export type StringLength<S extends string> = string extends S
548
- ? never
549
- : StringToArray<S>['length'];
485
+ export type StringLength<S extends string> = string extends S ? never : StringToArray<S>["length"];
550
486
  /**
551
487
  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.
552
488
 
@@ -559,17 +495,8 @@ SameLengthPositiveNumericStringGt<'10', '10'>;
559
495
  //=> false
560
496
  ```
561
497
  */
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';
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";
573
500
  /**
574
501
  Returns a boolean for whether `A` is greater than `B`, where `A` and `B` are both positive numeric strings.
575
502
 
@@ -585,21 +512,16 @@ PositiveNumericStringGt<'1', '500'>;
585
512
  //=> false
586
513
  ```
587
514
  */
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;
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;
603
525
  /**
604
526
  Returns a boolean for whether `A` represents a number greater than `B`, where `A` and `B` are both positive numeric characters.
605
527
 
@@ -612,16 +534,7 @@ PositiveNumericCharacterGt<'1', '1'>;
612
534
  //=> false
613
535
  ```
614
536
  */
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;
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;
625
538
  /**
626
539
  Returns the absolute value of a given value.
627
540
 
@@ -637,10 +550,7 @@ NumberAbsolute<NegativeInfinity>
637
550
  //=> PositiveInfinity
638
551
  ```
639
552
  */
640
- export type NumberAbsolute<N extends number> =
641
- `${N}` extends `-${infer StringPositiveN}`
642
- ? StringToNumber<StringPositiveN>
643
- : N;
553
+ export type NumberAbsolute<N extends number> = `${N}` extends `-${infer StringPositiveN}` ? StringToNumber<StringPositiveN> : N;
644
554
  /**
645
555
  Check whether the given type is a number or a number string.
646
556
 
@@ -660,13 +570,7 @@ type C = IsNumberLike<1>;
660
570
  type D = IsNumberLike<'a'>;
661
571
  //=> false
662
572
  */
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;
573
+ export type IsNumberLike<N> = N extends number ? true : N extends `${number}` ? true : N extends `${number}.${number}` ? true : false;
670
574
  /**
671
575
  Matches any primitive, `void`, `Date`, or `RegExp` value.
672
576
  */
@@ -674,12 +578,7 @@ export type BuiltIns = Primitive | void | Date | RegExp;
674
578
  /**
675
579
  Matches non-recursive types.
676
580
  */
677
- export type NonRecursiveType =
678
- | BuiltIns
679
- | Function
680
- | (new (
681
- ...arguments_: any[]
682
- ) => unknown);
581
+ export type NonRecursiveType = BuiltIns | Function | (new (...arguments_: any[]) => unknown);
683
582
  /**
684
583
  Returns the sum of two numbers.
685
584
 
@@ -711,45 +610,35 @@ Sum<PositiveInfinity, NegativeInfinity>;
711
610
  @category Numeric
712
611
  */
713
612
  // TODO: Support big integer and negative number.
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;
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;
753
642
  /**
754
643
  Returns the difference between two numbers.
755
644
 
@@ -780,40 +669,29 @@ Subtract<PositiveInfinity, PositiveInfinity>;
780
669
  @category Numeric
781
670
  */
782
671
  // TODO: Support big integer and negative number.
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;
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;
817
695
  /**
818
696
  Paths options.
819
697
 
@@ -904,85 +782,28 @@ open('listB.1'); // TypeError. Because listB only has one element.
904
782
  @category Object
905
783
  @category Array
906
784
  */
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;
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;
986
807
  export type PlainObject = UnknownRecord;
987
808
  /**
988
809
  * - Set the value in an object using a known path
@@ -990,10 +811,7 @@ export type PlainObject = UnknownRecord;
990
811
  * - 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
991
812
  * - Returns the original object
992
813
  */
993
- export declare function setValue<
994
- Data extends PlainObject,
995
- Path extends Paths<Data>,
996
- >(data: Data, path: Path, value: unknown): Data;
814
+ export declare function setValue<Data extends PlainObject, Path extends Paths<Data>>(data: Data, path: Path, value: unknown): Data;
997
815
  /**
998
816
  * - Set the value in an object using an unknown path
999
817
  * - You can set a nested value by using dot notation, e.g., `foo.bar.baz`
@@ -1001,11 +819,6 @@ export declare function setValue<
1001
819
  * - If `ignoreCase` is `true`, path matching will be case-insensitive
1002
820
  * - Returns the original object
1003
821
  */
1004
- export declare function setValue<Data extends PlainObject>(
1005
- data: Data,
1006
- path: string,
1007
- value: unknown,
1008
- ignoreCase?: boolean,
1009
- ): Data;
822
+ export declare function setValue<Data extends PlainObject>(data: Data, path: string, value: unknown, ignoreCase?: boolean): Data;
1010
823
 
1011
824
  export {};