type-plus 4.1.0 → 4.3.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.
Files changed (55) hide show
  1. package/README.md +4 -2
  2. package/cjs/array/CreateTuple.d.ts +8 -4
  3. package/cjs/array/Last.d.ts +4 -0
  4. package/cjs/array/Last.js +3 -0
  5. package/cjs/array/Last.js.map +1 -0
  6. package/cjs/array/Some.d.ts +7 -6
  7. package/cjs/array/Tail.d.ts +3 -0
  8. package/cjs/array/index.d.ts +1 -0
  9. package/cjs/array/index.js.map +1 -1
  10. package/cjs/functional/compose.d.ts +6 -0
  11. package/cjs/functional/compose.js +21 -0
  12. package/cjs/functional/compose.js.map +1 -0
  13. package/cjs/functional/index.d.ts +1 -0
  14. package/cjs/functional/index.js +15 -0
  15. package/cjs/functional/index.js.map +1 -1
  16. package/cjs/math/Abs.d.ts +1 -1
  17. package/cjs/math/Add.d.ts +14 -10
  18. package/cjs/math/Digit.d.ts +7 -9
  19. package/cjs/math/GreaterThan.d.ts +11 -10
  20. package/cjs/math/Max.d.ts +10 -9
  21. package/cjs/math/Subtract.d.ts +11 -10
  22. package/cjs/math/index.d.ts +1 -0
  23. package/cjs/nodejs/isNodeError.d.ts +1 -2
  24. package/cjs/nodejs/isNodeError.js.map +1 -1
  25. package/cjs/object/split.d.ts +5 -1
  26. package/cjs/object/split.js.map +1 -1
  27. package/esm/array/Last.js +2 -0
  28. package/esm/array/Last.js.map +1 -0
  29. package/esm/array/index.js.map +1 -1
  30. package/esm/functional/compose.js +7 -0
  31. package/esm/functional/compose.js.map +1 -0
  32. package/esm/functional/index.js +1 -1
  33. package/esm/functional/index.js.map +1 -1
  34. package/esm/nodejs/isNodeError.js.map +1 -1
  35. package/esm/object/split.js.map +1 -1
  36. package/package.json +5 -3
  37. package/ts/array/CreateTuple.ts +12 -7
  38. package/ts/array/Last.spec.ts +32 -0
  39. package/ts/array/Last.ts +4 -0
  40. package/ts/array/Some.ts +26 -24
  41. package/ts/array/Tail.spec.ts +32 -32
  42. package/ts/array/Tail.ts +10 -7
  43. package/ts/array/index.ts +1 -0
  44. package/ts/functional/compose.spec.ts +32 -0
  45. package/ts/functional/compose.ts +9 -0
  46. package/ts/functional/index.ts +1 -0
  47. package/ts/math/Abs.ts +4 -4
  48. package/ts/math/Add.ts +52 -49
  49. package/ts/math/Digit.ts +115 -115
  50. package/ts/math/GreaterThan.ts +38 -36
  51. package/ts/math/Max.ts +32 -31
  52. package/ts/math/Subtract.ts +43 -40
  53. package/ts/math/index.ts +1 -0
  54. package/ts/nodejs/isNodeError.ts +1 -2
  55. package/ts/object/split.ts +5 -1
package/README.md CHANGED
@@ -326,6 +326,7 @@ nominalMatch(b1, b2) // false
326
326
  ## Functional Types
327
327
 
328
328
  - `ChainFn<T>: T`: chain function that returns the input type.
329
+ - `compose(...fns): F`: compose functions
329
330
 
330
331
  ## Type Utilities
331
332
 
@@ -345,7 +346,7 @@ type No = IsAny<1, 'yes', 'no'> // 'no'
345
346
 
346
347
  - `CommonPropKeys<A>`: gets common keys inside the records in the array `A` (deprecate `CommonKeys`).
347
348
  - `Concat<A, B>`: `[...A, ...B]`.
348
- - `CreateTuple<L, T>`: creates `Tuple<T>` with `L` number of elements.
349
+ - `CreateTuple<L, T>`: Creates `Tuple<T>` with `L` number of elements.
349
350
  - `DropFirst<A>`: drops the first value type of `A`.
350
351
  - `DropLast<A>`: drops the last value type of `A`.
351
352
  - `Filter<A, Criteria>`: gets the array of types satisfying `Criteria` in `A`.
@@ -354,13 +355,14 @@ type No = IsAny<1, 'yes', 'no'> // 'no'
354
355
  - `Head<A>`: gets the first entry in the array.
355
356
  - `IntersectOfProps<A, K>`: gets the intersect of `A[K]` types (deprecate `MapToProp`)
356
357
  - `IsArray<T>`: `logical` predicate for `Array`.
358
+ - `Last<A>`: gets the last type of an array or tuple.
357
359
  - `literalArray(...entries)`: return an array whose items are restricted to the provided literals.
358
360
  - `PadLeft<A, Total, PadWith>`: pads `A` with `PadWith` if the length of `A` is less than `L`.
359
361
  - `reduceWhile()`: `reduce()` with predicate for early termination. \
360
362
  A simple version of the same function in the `ramda` package.
361
363
  - `Reverse<A>`: reverses the order of `A`.
362
364
  - `Some<A, Criteria>`: true if some elements in `A` matches `Criteria`.
363
- - `Tail<A>`: gets the remaining entries in the array except the first.
365
+ - `Tail<A>`: Gets the types of a tuple except the first entry.
364
366
  - `UnionOfProps<A, K>`: gets the union of `A[K]` types (deprecate `PropUnion`).
365
367
  - `UnionOfValues<A>`: gets the union of value types in `A` (deprecate `ArrayValue`).
366
368
 
@@ -1,4 +1,8 @@
1
- import { IsPositive } from '../math';
2
- export declare type CreateTuple<L extends number, T = any> = IsPositive<L> extends true ? Device<[], L, T> : never;
3
- declare type Device<R extends any[], L extends number, T> = R['length'] extends L ? R : Device<[T, ...R], L, T>;
4
- export {};
1
+ import type { IsPositive } from '../math';
2
+ /**
3
+ * Creates `Tuple<T>` with `L` number of elements.
4
+ */
5
+ export declare type CreateTuple<L extends number, T = any> = IsPositive<L> extends true ? CreateTuple.Device<[], L, T> : never;
6
+ export declare namespace CreateTuple {
7
+ type Device<R extends any[], L extends number, T> = R['length'] extends L ? R : Device<[T, ...R], L, T>;
8
+ }
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Get the last type of an array or tuple.
3
+ */
4
+ export declare type Last<T extends any[]> = T extends [...any[], infer R] ? R : T[0];
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=Last.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Last.js","sourceRoot":"","sources":["../../ts/array/Last.ts"],"names":[],"mappings":""}
@@ -1,6 +1,7 @@
1
- import { Equal } from '../predicates';
2
- import { Tail } from './Tail';
3
- import { UnionOfValues } from './UnionOfValues';
4
- export declare type Some<A extends any[], Criteria, Mode extends 'strict' | 'loose' = 'loose', Then = true, Else = false> = Mode extends 'strict' ? SomeStrict<A, Criteria, Then, Else> : number extends A['length'] ? UnionOfValues<A> extends Criteria ? Then : Else : A['length'] extends 0 ? Else : A[0] extends Criteria ? Then : Some<Tail<A>, Criteria, 'loose', Then, Else>;
5
- declare type SomeStrict<A extends any[], Criteria, Then, Else> = number extends A['length'] ? (Equal<UnionOfValues<A>, Criteria> extends true ? Then : Else) : (A['length'] extends 0 ? Else : (Equal<A[0], Criteria> extends true ? Then : SomeStrict<Tail<A>, Criteria, Then, Else>));
6
- export {};
1
+ import type { Equal } from '../predicates';
2
+ import type { Tail } from './Tail';
3
+ import type { UnionOfValues } from './UnionOfValues';
4
+ export declare type Some<A extends any[], Criteria, Mode extends 'strict' | 'loose' = 'loose', Then = true, Else = false> = Mode extends 'strict' ? Some.Strict<A, Criteria, Then, Else> : number extends A['length'] ? UnionOfValues<A> extends Criteria ? Then : Else : A['length'] extends 0 ? Else : A[0] extends Criteria ? Then : Some<Tail<A>, Criteria, 'loose', Then, Else>;
5
+ export declare namespace Some {
6
+ type Strict<A extends any[], Criteria, Then, Else> = number extends A['length'] ? (Equal<UnionOfValues<A>, Criteria> extends true ? Then : Else) : (A['length'] extends 0 ? Else : (Equal<A[0], Criteria> extends true ? Then : Strict<Tail<A>, Criteria, Then, Else>));
7
+ }
@@ -1,2 +1,5 @@
1
1
  import { UnionOfValues } from './UnionOfValues';
2
+ /**
3
+ * Gets the types of a tuple except the first entry.
4
+ */
2
5
  export declare type Tail<T extends any[]> = T['length'] extends 0 ? never : (T extends [any, ...infer Tail] ? (Tail extends UnionOfValues<T>[] ? Tail : never) : T);
@@ -9,6 +9,7 @@ export type { FindLast } from './FindLast';
9
9
  export type { Head } from './Head';
10
10
  export type { IntersectOfProps, MapToProp } from './IntersectOfProps';
11
11
  export type { IsArray } from './IsArray';
12
+ export type { Last } from './Last';
12
13
  export * from './literalArray';
13
14
  export type { PadLeft } from './PadLeft';
14
15
  export * from './reduceWhile';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../ts/array/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAWA,iDAA8B;AAE9B,gDAA6B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../ts/array/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAYA,iDAA8B;AAE9B,gDAA6B"}
@@ -0,0 +1,6 @@
1
+ import { Head, Last } from '../array';
2
+ import { AnyFunction } from '../function/AnyFunction';
3
+ /**
4
+ * compose functions
5
+ */
6
+ export declare function compose<FS extends AnyFunction[]>(...fns: FS): (...args: Parameters<Head<FS>>) => ReturnType<Last<FS>>;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.compose = void 0;
4
+ /**
5
+ * compose functions
6
+ */
7
+ function compose() {
8
+ var fns = [];
9
+ for (var _i = 0; _i < arguments.length; _i++) {
10
+ fns[_i] = arguments[_i];
11
+ }
12
+ return function () {
13
+ var args = [];
14
+ for (var _i = 0; _i < arguments.length; _i++) {
15
+ args[_i] = arguments[_i];
16
+ }
17
+ return fns.reduce(function (args, fn) { return [fn.apply(void 0, args)]; }, args)[0];
18
+ };
19
+ }
20
+ exports.compose = compose;
21
+ //# sourceMappingURL=compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.js","sourceRoot":"","sources":["../../ts/functional/compose.ts"],"names":[],"mappings":";;;AAGA;;GAEG;AACH,SAAgB,OAAO;IAA2B,aAAU;SAAV,UAAU,EAAV,qBAAU,EAAV,IAAU;QAAV,wBAAU;;IAC1D,OAAO;QAAC,cAAc;aAAd,UAAc,EAAd,qBAAc,EAAd,IAAc;YAAd,yBAAc;;QAAK,OAAA,GAAG,CAAC,MAAM,CAAC,UAAC,IAAI,EAAE,EAAE,IAAK,OAAA,CAAC,EAAE,eAAI,IAAI,EAAE,EAAb,CAAa,EAAE,IAAI,CAAC,CAAC,CAAC,CAAQ;IAAvD,CAAuD,CAAA;AACpF,CAAC;AAFD,0BAEC"}
@@ -1 +1,2 @@
1
1
  export type { ChainFn, EndoFn } from './ChainFn';
2
+ export * from './compose';
@@ -1,3 +1,18 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
2
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./compose"), exports);
3
18
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../ts/functional/index.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../ts/functional/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAEA,4CAAyB"}
package/cjs/math/Abs.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { DigitArray } from './Digit';
1
+ import type { DigitArray } from './Digit';
2
2
  export declare type Abs<N extends number, Fail = never> = number extends N ? Fail : `${N}` extends `-${infer P}` ? DigitArray.ToNumber<DigitArray.FromString<P>> : N;
package/cjs/math/Add.d.ts CHANGED
@@ -1,17 +1,21 @@
1
- import { PadLeft } from '../array';
2
- import { And } from '../predicates';
3
- import { Digit, DigitArray } from './Digit';
4
- import { IsPositive } from './IsPositive';
5
- import { IsWhole } from './IsWhole';
6
- import { Max } from './Max';
1
+ import type { PadLeft } from '../array';
2
+ import type { And } from '../predicates';
3
+ import type { Digit, DigitArray } from './Digit';
4
+ import type { IsPositive } from './IsPositive';
5
+ import type { IsWhole } from './IsWhole';
6
+ import type { Max } from './Max';
7
7
  /**
8
8
  * Add two number literals.
9
9
  */
10
- export declare type Add<A extends number, B extends number, Fail = never> = And<And<IsPositive<A>, IsWhole<A>>, And<IsPositive<B>, IsWhole<B>>> extends false ? Fail : DigitArray.FromNumber<A> extends infer DA ? DA extends number[] ? DigitArray.FromNumber<B> extends infer DB ? DB extends number[] ? Max<DA['length'], DB['length']> extends infer M ? M extends number ? PadLeft<DA, M, 0> extends infer PDA ? PDA extends number[] ? PadLeft<DB, M, 0> extends infer PDB ? PDB extends number[] ? DigitArray.ToNumber<AddDigitArray<PDA, PDB>> : Fail : Fail : Fail : Fail : Fail : Fail : Fail : Fail : Fail : Fail;
11
- declare type AddDigitArray<A extends number[], B extends number[]> = (A extends [any, ...infer ATail] ? (ATail extends number[] ? (B extends [any, ...infer BTail] ? (BTail extends number[] ? [AddDigit<A[0], B[0]>, ...AddDigitArray<ATail, BTail>] : []) : [A[0], ...AddDigitArray<[], ATail>]) : []) : (B extends [any, ...infer BTail] ? (BTail extends number[] ? [B[0], ...AddDigitArray<[], BTail>] : []) : []));
12
- declare type AddDigit<A extends number, B extends number> = [...Digit.ToTuple[A], ...Digit.ToTuple[B]]['length'];
10
+ export declare type Add<A extends number, B extends number, Fail = never> = And<And<IsPositive<A>, IsWhole<A>>, And<IsPositive<B>, IsWhole<B>>> extends false ? Fail : DigitArray.FromNumber<A> extends infer DA ? DA extends number[] ? DigitArray.FromNumber<B> extends infer DB ? DB extends number[] ? Max<DA['length'], DB['length']> extends infer M ? M extends number ? PadLeft<DA, M, 0> extends infer PDA ? PDA extends number[] ? PadLeft<DB, M, 0> extends infer PDB ? PDB extends number[] ? DigitArray.ToNumber<Add.DigitArray<PDA, PDB>> : Fail : Fail : Fail : Fail : Fail : Fail : Fail : Fail : Fail : Fail;
11
+ export declare namespace Add {
12
+ type DigitArray<A extends number[], B extends number[]> = (A extends [any, ...infer ATail] ? (ATail extends number[] ? (B extends [any, ...infer BTail] ? (BTail extends number[] ? [Digit<A[0], B[0]>, ...DigitArray<ATail, BTail>] : []) : [A[0], ...DigitArray<[], ATail>]) : []) : (B extends [any, ...infer BTail] ? (BTail extends number[] ? [B[0], ...DigitArray<[], BTail>] : []) : []));
13
+ type Digit<A extends number, B extends number> = [
14
+ ...Digit.ToTuple[A],
15
+ ...Digit.ToTuple[B]
16
+ ]['length'];
17
+ }
13
18
  /**
14
19
  * Increment `A` by 1.
15
20
  */
16
21
  export declare type Increment<A extends number, Fail = never> = Add<A, 1, Fail>;
17
- export {};
@@ -3,7 +3,7 @@ import { And } from '../predicates';
3
3
  import { IsPositive } from './IsPositive';
4
4
  import { IsWhole } from './IsWhole';
5
5
  export declare namespace Digit {
6
- export type ToTuple = {
6
+ type ToTuple = {
7
7
  [k in number]: any[];
8
8
  } & {
9
9
  0: [];
@@ -30,7 +30,7 @@ export declare namespace Digit {
30
30
  /**
31
31
  * A > B for [1-9]
32
32
  */
33
- export type GreaterThan<A extends number, B extends number> = B extends GreaterThanMap[A] ? true : false;
33
+ type GreaterThan<A extends number, B extends number> = B extends GreaterThanMap[A] ? true : false;
34
34
  type GreaterThanMap = {
35
35
  [k in number]: number;
36
36
  } & {
@@ -45,16 +45,15 @@ export declare namespace Digit {
45
45
  8: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7;
46
46
  9: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;
47
47
  };
48
- export {};
49
48
  }
50
49
  export declare namespace DigitArray {
51
- export type ToNumber<C extends number[]> = ToTuple<[], C>['length'];
52
- export type ToTuple<R extends any[], S extends number[]> = S['length'] extends 0 ? R : (S['length'] extends 1 ? [...R, ...Digit.ToTuple[S[0]]] : (S extends [any, ...infer T] ? (T extends any[] ? ToTuple<Multi10<[...R, ...Digit.ToTuple[S[0]]]>, T> : never) : never));
50
+ type ToNumber<C extends number[]> = ToTuple<[], C>['length'];
51
+ type ToTuple<R extends any[], S extends number[]> = S['length'] extends 0 ? R : (S['length'] extends 1 ? [...R, ...Digit.ToTuple[S[0]]] : (S extends [any, ...infer T] ? (T extends any[] ? ToTuple<Multi10<[...R, ...Digit.ToTuple[S[0]]]>, T> : never) : never));
53
52
  type Multi10<C extends any[]> = [...C, ...C, ...C, ...C, ...C, ...C, ...C, ...C, ...C, ...C];
54
- export type FromNumber<N extends number> = FromString<NumberToString<N>>;
53
+ type FromNumber<N extends number> = FromString<NumberToString<N>>;
55
54
  type NumberToString<N extends number> = (And<IsPositive<N>, IsWhole<N>>) extends true ? `${N}` : never;
56
- export type FromString<S extends string> = S extends `1${infer L}` ? [1, ...FromString<L>] : S extends `2${infer L}` ? [2, ...FromString<L>] : S extends `3${infer L}` ? [3, ...FromString<L>] : S extends `4${infer L}` ? [4, ...FromString<L>] : S extends `5${infer L}` ? [5, ...FromString<L>] : S extends `6${infer L}` ? [6, ...FromString<L>] : S extends `7${infer L}` ? [7, ...FromString<L>] : S extends `8${infer L}` ? [8, ...FromString<L>] : S extends `9${infer L}` ? [9, ...FromString<L>] : S extends `0${infer L}` ? [0, ...FromString<L>] : [];
57
- export type Shift10<DA extends number[]> = TrimLeadingZero<Shift10State<[], DA>>;
55
+ type FromString<S extends string> = S extends `1${infer L}` ? [1, ...FromString<L>] : S extends `2${infer L}` ? [2, ...FromString<L>] : S extends `3${infer L}` ? [3, ...FromString<L>] : S extends `4${infer L}` ? [4, ...FromString<L>] : S extends `5${infer L}` ? [5, ...FromString<L>] : S extends `6${infer L}` ? [6, ...FromString<L>] : S extends `7${infer L}` ? [7, ...FromString<L>] : S extends `8${infer L}` ? [8, ...FromString<L>] : S extends `9${infer L}` ? [9, ...FromString<L>] : S extends `0${infer L}` ? [0, ...FromString<L>] : [];
56
+ type Shift10<DA extends number[]> = TrimLeadingZero<Shift10State<[], DA>>;
58
57
  type Shift10State<R extends number[], DA extends number[]> = DA['length'] extends 0 ? R : (DA['length'] extends 1 ? [...R, ...DA] : (DA extends [any, ...infer T] ? (T extends number[] ? (DA[0] extends 0 ? Shift10State<[...R, DA[0]], T> : (T extends [any, ...infer Y] ? (Y extends number[] ? Shift10State<[...R, MinusOne[DA[0]]], [Plus10[T[0]], ...Y]> : []) : [])) : []) : []));
59
58
  type TrimLeadingZero<A extends number[]> = A['length'] extends 0 ? A : A[0] extends 0 ? TrimLeadingZero<Tail<A>> : A;
60
59
  type MinusOne = {
@@ -95,5 +94,4 @@ export declare namespace DigitArray {
95
94
  8: 18;
96
95
  9: 19;
97
96
  };
98
- export {};
99
97
  }
@@ -1,10 +1,11 @@
1
- import { Head, PadLeft, Tail } from '../array';
2
- import { And, Equal } from '../predicates';
3
- import { Digit, DigitArray } from './Digit';
4
- import { IsPositive } from './IsPositive';
5
- import { IsWhole } from './IsWhole';
6
- import { Max } from './Max';
7
- export declare type GreaterThan<A extends number, B extends number, Fail = never> = And<And<IsPositive<A>, IsWhole<A>>, And<IsPositive<B>, IsWhole<B>>> extends false ? Fail : number extends A ? Fail : number extends B ? Fail : Equal<A, B> extends true ? false : GreaterThanOnPositiveWhole<A, B>;
8
- declare type GreaterThanOnPositiveWhole<A extends number, B extends number> = (DigitArray.FromNumber<A> extends infer DA ? DA extends number[] ? DigitArray.FromNumber<B> extends infer DB ? DB extends number[] ? Max<DA['length'], DB['length']> extends infer M ? M extends number ? PadLeft<DA, M, 0> extends infer PDA ? PDA extends number[] ? PadLeft<DB, M, 0> extends infer PDB ? PDB extends number[] ? GreaterThanOnDigitArray<PDA, PDB> : never : never : never : never : never : never : never : never : never : never);
9
- declare type GreaterThanOnDigitArray<DA extends number[], DB extends number[]> = (Equal<Head<DA>, Head<DB>> extends true ? GreaterThanOnDigitArray<Tail<DA>, Tail<DB>> extends Tail<DA> ? true : false : Digit.GreaterThan<Head<DA>, Head<DB>> extends true ? true : false);
10
- export {};
1
+ import type { Head, PadLeft, Tail } from '../array';
2
+ import type { And, Equal } from '../predicates';
3
+ import type { Digit, DigitArray } from './Digit';
4
+ import type { IsPositive } from './IsPositive';
5
+ import type { IsWhole } from './IsWhole';
6
+ import type { Max } from './Max';
7
+ export declare type GreaterThan<A extends number, B extends number, Fail = never> = And<And<IsPositive<A>, IsWhole<A>>, And<IsPositive<B>, IsWhole<B>>> extends false ? Fail : number extends A ? Fail : number extends B ? Fail : Equal<A, B> extends true ? false : GreaterThan.OnPositiveWhole<A, B>;
8
+ export declare namespace GreaterThan {
9
+ type OnPositiveWhole<A extends number, B extends number> = (DigitArray.FromNumber<A> extends infer DA ? DA extends number[] ? DigitArray.FromNumber<B> extends infer DB ? DB extends number[] ? Max<DA['length'], DB['length']> extends infer M ? M extends number ? PadLeft<DA, M, 0> extends infer PDA ? PDA extends number[] ? PadLeft<DB, M, 0> extends infer PDB ? PDB extends number[] ? OnDigitArray<PDA, PDB> : never : never : never : never : never : never : never : never : never : never);
10
+ type OnDigitArray<DA extends number[], DB extends number[]> = (Equal<Head<DA>, Head<DB>> extends true ? OnDigitArray<Tail<DA>, Tail<DB>> extends Tail<DA> ? true : false : Digit.GreaterThan<Head<DA>, Head<DB>> extends true ? true : false);
11
+ }
package/cjs/math/Max.d.ts CHANGED
@@ -1,9 +1,10 @@
1
- import { Head, Tail } from '../array';
2
- import { And, Equal } from '../predicates';
3
- import { Digit, DigitArray } from './Digit';
4
- import { IsPositive } from './IsPositive';
5
- import { IsWhole } from './IsWhole';
6
- export declare type Max<A extends number, B extends number, Fail = never> = And<IsPositive<A>, IsWhole<A>> extends false ? Fail : And<IsPositive<B>, IsWhole<B>> extends false ? Fail : number extends A ? Fail : number extends B ? Fail : Equal<A, B> extends true ? A : MaxOnPositiveWhole<A, B>;
7
- declare type MaxOnPositiveWhole<A extends number, B extends number> = (DigitArray.FromNumber<A> extends infer DA ? DA extends number[] ? DigitArray.FromNumber<B> extends infer DB ? DB extends number[] ? MaxOnDigitArray<DA, DB> extends DA ? A : B : never : never : never : never);
8
- declare type MaxOnDigitArray<DA extends number[], DB extends number[]> = Equal<DA['length'], DB['length']> extends true ? (Equal<Head<DA>, Head<DB>> extends true ? (Tail<DA> extends infer TDA ? TDA extends number[] ? MaxOnDigitArray<TDA, Tail<DB>> extends TDA ? DA : DB : never : never) : Digit.GreaterThan<Head<DA>, Head<DB>> extends true ? DA : DB) : MaxOnPositiveWhole<DA['length'], DB['length']> extends DA['length'] ? DA : DB;
9
- export {};
1
+ import type { Head, Tail } from '../array';
2
+ import type { And, Equal } from '../predicates';
3
+ import type { Digit, DigitArray } from './Digit';
4
+ import type { IsPositive } from './IsPositive';
5
+ import type { IsWhole } from './IsWhole';
6
+ export declare type Max<A extends number, B extends number, Fail = never> = And<IsPositive<A>, IsWhole<A>> extends false ? Fail : And<IsPositive<B>, IsWhole<B>> extends false ? Fail : number extends A ? Fail : number extends B ? Fail : Equal<A, B> extends true ? A : Max.OnPositiveWhole<A, B>;
7
+ export declare namespace Max {
8
+ type OnPositiveWhole<A extends number, B extends number> = (DigitArray.FromNumber<A> extends infer DA ? DA extends number[] ? DigitArray.FromNumber<B> extends infer DB ? DB extends number[] ? OnDigitArray<DA, DB> extends DA ? A : B : never : never : never : never);
9
+ type OnDigitArray<DA extends number[], DB extends number[]> = Equal<DA['length'], DB['length']> extends true ? (Equal<Head<DA>, Head<DB>> extends true ? (Tail<DA> extends infer TDA ? TDA extends number[] ? OnDigitArray<TDA, Tail<DB>> extends TDA ? DA : DB : never : never) : Digit.GreaterThan<Head<DA>, Head<DB>> extends true ? DA : DB) : OnPositiveWhole<DA['length'], DB['length']> extends DA['length'] ? DA : DB;
10
+ }
@@ -1,14 +1,15 @@
1
- import { PadLeft, Some, Tail } from '../array';
2
- import { And } from '../predicates';
3
- import { Digit, DigitArray } from './Digit';
4
- import { IsPositive } from './IsPositive';
5
- import { IsWhole } from './IsWhole';
6
- import { Max } from './Max';
7
- export declare type Subtract<A extends number, B extends number, Fail = never> = And<And<IsPositive<A>, IsWhole<A>>, And<IsPositive<B>, IsWhole<B>>> extends true ? (DigitArray.Shift10<DigitArray.FromNumber<A>> extends infer DA ? DA extends number[] ? DigitArray.FromNumber<B> extends infer DB ? DB extends number[] ? Max<DA['length'], DB['length']> extends infer M ? M extends number ? PadLeft<DA, M, 0> extends infer PDA ? PDA extends number[] ? PadLeft<DB, M, 0> extends infer PDB ? PDB extends number[] ? SubtractDigitArray<[], PDA, PDB> extends infer Result ? Result extends number[] ? Some<Result, never, 'strict'> extends true ? Fail : DigitArray.ToNumber<Result> : Fail : Fail : Fail : Fail : Fail : Fail : Fail : Fail : Fail : Fail : Fail : Fail) : Fail;
8
- declare type SubtractDigitArray<R extends number[], A extends number[], B extends number[]> = A['length'] extends 0 ? R : SubtractDigitArray<[...R, SubtractDigit<A[0], B[0]>], Tail<A>, Tail<B>>;
9
- declare type SubtractDigit<A extends number, B extends number> = Digit.ToTuple[A] extends [...(infer U), ...Digit.ToTuple[B]] ? U['length'] : never;
1
+ import type { PadLeft, Some, Tail } from '../array';
2
+ import type { And } from '../predicates';
3
+ import type { Digit, DigitArray } from './Digit';
4
+ import type { IsPositive } from './IsPositive';
5
+ import type { IsWhole } from './IsWhole';
6
+ import type { Max } from './Max';
7
+ export declare type Subtract<A extends number, B extends number, Fail = never> = And<And<IsPositive<A>, IsWhole<A>>, And<IsPositive<B>, IsWhole<B>>> extends true ? (DigitArray.Shift10<DigitArray.FromNumber<A>> extends infer DA ? DA extends number[] ? DigitArray.FromNumber<B> extends infer DB ? DB extends number[] ? Max<DA['length'], DB['length']> extends infer M ? M extends number ? PadLeft<DA, M, 0> extends infer PDA ? PDA extends number[] ? PadLeft<DB, M, 0> extends infer PDB ? PDB extends number[] ? Subtract.DigitArray<[], PDA, PDB> extends infer Result ? Result extends number[] ? Some<Result, never, 'strict'> extends true ? Fail : DigitArray.ToNumber<Result> : Fail : Fail : Fail : Fail : Fail : Fail : Fail : Fail : Fail : Fail : Fail : Fail) : Fail;
8
+ export declare namespace Subtract {
9
+ type DigitArray<R extends number[], A extends number[], B extends number[]> = A['length'] extends 0 ? R : DigitArray<[...R, Digit<A[0], B[0]>], Tail<A>, Tail<B>>;
10
+ type Digit<A extends number, B extends number> = Digit.ToTuple[A] extends [...(infer U), ...Digit.ToTuple[B]] ? U['length'] : never;
11
+ }
10
12
  /**
11
13
  * A - 1
12
14
  */
13
15
  export declare type Decrement<A extends number, Fail = never> = Subtract<A, 1, Fail>;
14
- export {};
@@ -1,5 +1,6 @@
1
1
  export type { Abs } from './Abs';
2
2
  export type { Add, Increment } from './Add';
3
+ export type { Digit, DigitArray } from './Digit';
3
4
  export type { GreaterThan } from './GreaterThan';
4
5
  export type { IsPositive } from './IsPositive';
5
6
  export type { IsWhole } from './IsWhole';
@@ -1,4 +1,4 @@
1
- declare type SystemErrors = {
1
+ export declare type SystemErrors = {
2
2
  'EACCES': Error & {
3
3
  code: 'EACCES';
4
4
  };
@@ -28,4 +28,3 @@ export declare type SystemErrorCodes = keyof SystemErrors;
28
28
  * Feel free to contribute.
29
29
  */
30
30
  export declare function isSystemError<C extends SystemErrorCodes>(code: C, err: unknown): err is SystemErrors[C];
31
- export {};
@@ -1 +1 @@
1
- {"version":3,"file":"isNodeError.js","sourceRoot":"","sources":["../../ts/nodejs/isNodeError.ts"],"names":[],"mappings":";;;AAoBA;;;;GAIG;AACH,SAAgB,aAAa,CAA6B,IAAO,EAAE,GAAY;IAC7E,OAAO,CAAC,CAAC,GAAG,IAAK,GAAW,CAAC,IAAI,KAAK,IAAI,CAAA;AAC5C,CAAC;AAFD,sCAEC"}
1
+ {"version":3,"file":"isNodeError.js","sourceRoot":"","sources":["../../ts/nodejs/isNodeError.ts"],"names":[],"mappings":";;;AAmBA;;;;GAIG;AACH,SAAgB,aAAa,CAA6B,IAAO,EAAE,GAAY;IAC7E,OAAO,CAAC,CAAC,GAAG,IAAK,GAAW,CAAC,IAAI,KAAK,IAAI,CAAA;AAC5C,CAAC;AAFD,sCAEC"}
@@ -2,9 +2,13 @@ import { AnyRecord, Omit } from '..';
2
2
  declare type Splitter<T extends AnyRecord> = Partial<{
3
3
  [k in keyof T]: T[k] | undefined;
4
4
  }>;
5
- declare type Split<T extends AnyRecord, S extends AnyRecord> = {
5
+ export declare type Split<T extends AnyRecord, S extends AnyRecord> = {
6
6
  [k in keyof S]: NonNullable<T[k]> | S[k];
7
7
  };
8
+ /**
9
+ * Split an object into multiple objects.
10
+ * @returns [...entries, remaining]
11
+ */
8
12
  export declare function split<T extends AnyRecord, S1 extends Splitter<T>>(target: T, split1: S1): [
9
13
  Split<T, S1>,
10
14
  Omit<T, keyof S1>
@@ -1 +1 @@
1
- {"version":3,"file":"split.js","sourceRoot":"","sources":["../../ts/object/split.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wBAAiD;AAyLjD,SAAgB,KAAK,CAAC,MAAiB;IAAE,mBAAyB;SAAzB,UAAyB,EAAzB,qBAAyB,EAAzB,IAAyB;QAAzB,kCAAyB;;IAChE,IAAM,MAAM,GAAc,EAAE,CAAA;IAC5B,IAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,IAAA,eAAW,EAAC,CAAC,EAAE,UAAC,CAAC,EAAE,CAAC,YAAK,OAAA,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,MAAA,MAAM,CAAC,CAAC,CAAC,mCAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA,EAAA,EAAE,EAAe,CAAC,EAA1F,CAA0F,CAAC,CAAA;IACxH,IAAM,CAAC,GAAG,IAAA,eAAW,EAAC,MAAM,EAAE,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAArC,CAAqC,EAAE,EAAe,CAAC,CAAA;IAC/F,uCAAW,CAAC,UAAE,CAAC,UAAC;AAClB,CAAC;AALD,sBAKC"}
1
+ {"version":3,"file":"split.js","sourceRoot":"","sources":["../../ts/object/split.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wBAAiD;AA6LjD,SAAgB,KAAK,CAAC,MAAiB;IAAE,mBAAyB;SAAzB,UAAyB,EAAzB,qBAAyB,EAAzB,IAAyB;QAAzB,kCAAyB;;IAChE,IAAM,MAAM,GAAc,EAAE,CAAA;IAC5B,IAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,IAAA,eAAW,EAAC,CAAC,EAAE,UAAC,CAAC,EAAE,CAAC,YAAK,OAAA,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,MAAA,MAAM,CAAC,CAAC,CAAC,mCAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA,EAAA,EAAE,EAAe,CAAC,EAA1F,CAA0F,CAAC,CAAA;IACxH,IAAM,CAAC,GAAG,IAAA,eAAW,EAAC,MAAM,EAAE,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAArC,CAAqC,EAAE,EAAe,CAAC,CAAA;IAC/F,uCAAW,CAAC,UAAE,CAAC,UAAC;AAClB,CAAC;AALD,sBAKC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Last.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Last.js","sourceRoot":"","sources":["../../ts/array/Last.ts"],"names":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../ts/array/index.ts"],"names":[],"mappings":"AAWA,cAAc,gBAAgB,CAAA;AAE9B,cAAc,eAAe,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../ts/array/index.ts"],"names":[],"mappings":"AAYA,cAAc,gBAAgB,CAAA;AAE9B,cAAc,eAAe,CAAA"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * compose functions
3
+ */
4
+ export function compose(...fns) {
5
+ return (...args) => fns.reduce((args, fn) => [fn(...args)], args)[0];
6
+ }
7
+ //# sourceMappingURL=compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.js","sourceRoot":"","sources":["../../ts/functional/compose.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,UAAU,OAAO,CAA2B,GAAG,GAAO;IAC1D,OAAO,CAAC,GAAG,IAAW,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAQ,CAAA;AACpF,CAAC"}
@@ -1,2 +1,2 @@
1
- export {};
1
+ export * from './compose';
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../ts/functional/index.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../ts/functional/index.ts"],"names":[],"mappings":"AAEA,cAAc,WAAW,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"isNodeError.js","sourceRoot":"","sources":["../../ts/nodejs/isNodeError.ts"],"names":[],"mappings":"AAoBA;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAA6B,IAAO,EAAE,GAAY;IAC7E,OAAO,CAAC,CAAC,GAAG,IAAK,GAAW,CAAC,IAAI,KAAK,IAAI,CAAA;AAC5C,CAAC"}
1
+ {"version":3,"file":"isNodeError.js","sourceRoot":"","sources":["../../ts/nodejs/isNodeError.ts"],"names":[],"mappings":"AAmBA;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAA6B,IAAO,EAAE,GAAY;IAC7E,OAAO,CAAC,CAAC,GAAG,IAAK,GAAW,CAAC,IAAI,KAAK,IAAI,CAAA;AAC5C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"split.js","sourceRoot":"","sources":["../../ts/object/split.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,WAAW,EAAE,MAAM,IAAI,CAAA;AAyLjD,MAAM,UAAU,KAAK,CAAC,MAAiB,EAAE,GAAG,SAAsB;IAChE,MAAM,MAAM,GAAc,EAAE,CAAA;IAC5B,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAe,CAAC,CAAC,CAAA;IACxH,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAe,CAAC,CAAA;IAC/F,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;AAClB,CAAC"}
1
+ {"version":3,"file":"split.js","sourceRoot":"","sources":["../../ts/object/split.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,WAAW,EAAE,MAAM,IAAI,CAAA;AA6LjD,MAAM,UAAU,KAAK,CAAC,MAAiB,EAAE,GAAG,SAAsB;IAChE,MAAM,MAAM,GAAc,EAAE,CAAA;IAC5B,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAe,CAAC,CAAC,CAAA;IACxH,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAe,CAAC,CAAA;IAC/F,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;AAClB,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "type-plus",
3
- "version": "4.1.0",
4
- "description": "Provides additional types for `typescript`.",
3
+ "version": "4.3.1",
4
+ "description": "Provides additional types for TypeScript.",
5
5
  "homepage": "https://github.com/unional/type-plus",
6
6
  "bugs": {
7
7
  "url": "https://github.com/unional/type-plus/issues"
@@ -26,9 +26,10 @@
26
26
  "ts"
27
27
  ],
28
28
  "scripts": {
29
- "build": "run-p build:cjs build:esm",
29
+ "build": "run-p build:cjs build:esm build:doc",
30
30
  "build:cjs": "tsc -p tsconfig.cjs.json",
31
31
  "build:esm": "tsc -p tsconfig.esm.json",
32
+ "build:doc": "typedoc",
32
33
  "clean": "rimraf cjs esm coverage lib libm",
33
34
  "coverage": "jest --coverage",
34
35
  "depcheck": "yarn dependency-check",
@@ -83,6 +84,7 @@
83
84
  "rimraf": "^3.0.2",
84
85
  "satisfier": "^5.1.2",
85
86
  "size-limit": "^7.0.8",
87
+ "typedoc": "^0.22.13",
86
88
  "typescript": "^4.6.2"
87
89
  },
88
90
  "size-limit": [
@@ -1,7 +1,12 @@
1
- import { IsPositive } from '../math'
2
-
3
- export type CreateTuple<L extends number, T = any> =
4
- IsPositive<L> extends true ? Device<[], L, T> : never
5
-
6
- type Device<R extends any[], L extends number, T> =
7
- R['length'] extends L ? R : Device<[T, ...R], L, T>
1
+ import type { IsPositive } from '../math'
2
+
3
+ /**
4
+ * Creates `Tuple<T>` with `L` number of elements.
5
+ */
6
+ export type CreateTuple<L extends number, T = any> =
7
+ IsPositive<L> extends true ? CreateTuple.Device<[], L, T> : never
8
+
9
+ export namespace CreateTuple {
10
+ export type Device<R extends any[], L extends number, T> =
11
+ R['length'] extends L ? R : Device<[T, ...R], L, T>
12
+ }
@@ -0,0 +1,32 @@
1
+ import { AnyFunction, isType } from '..'
2
+ import { Last } from './Last'
3
+
4
+ test('any array', () => {
5
+ type A = Last<any[]>
6
+ isType.equal<true, any, A>()
7
+ })
8
+
9
+ test('never array', () => {
10
+ type A = Last<never[]>
11
+ isType.equal<true, never, A>()
12
+ })
13
+
14
+ test('typed array', () => {
15
+ type A = Last<string[]>
16
+ isType.equal<true, string, A>()
17
+ })
18
+
19
+ test('function array', () => {
20
+ type A = Last<AnyFunction[]>
21
+ isType.equal<true, AnyFunction, A>()
22
+ })
23
+
24
+ test('empty tuple gets undefined', () => {
25
+ type A = Last<[]>
26
+ isType.equal<true, undefined, A>()
27
+ })
28
+
29
+ test('tuple with function', () => {
30
+ type A = Last<[number, AnyFunction]>
31
+ isType.equal<true, AnyFunction, A>()
32
+ })
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Get the last type of an array or tuple.
3
+ */
4
+ export type Last<T extends any[]> = T extends [...any[], infer R] ? R : T[0]
package/ts/array/Some.ts CHANGED
@@ -1,24 +1,26 @@
1
- import { Equal } from '../predicates'
2
- import { Tail } from './Tail'
3
- import { UnionOfValues } from './UnionOfValues'
4
-
5
- export type Some<
6
- A extends any[],
7
- Criteria,
8
- Mode extends 'strict' | 'loose' = 'loose',
9
- Then = true,
10
- Else = false
11
- > =
12
- Mode extends 'strict' ? SomeStrict<A, Criteria, Then, Else> :
13
- number extends A['length'] ? UnionOfValues<A> extends Criteria ? Then : Else :
14
- A['length'] extends 0 ? Else :
15
- A[0] extends Criteria ? Then : Some<Tail<A>, Criteria, 'loose', Then, Else>
16
-
17
- type SomeStrict<A extends any[], Criteria, Then, Else> =
18
- number extends A['length']
19
- ? (Equal<UnionOfValues<A>, Criteria> extends true ? Then : Else)
20
- : (A['length'] extends 0
21
- ? Else
22
- : (Equal<A[0], Criteria> extends true
23
- ? Then
24
- : SomeStrict<Tail<A>, Criteria, Then, Else>))
1
+ import type { Equal } from '../predicates'
2
+ import type { Tail } from './Tail'
3
+ import type { UnionOfValues } from './UnionOfValues'
4
+
5
+ export type Some<
6
+ A extends any[],
7
+ Criteria,
8
+ Mode extends 'strict' | 'loose' = 'loose',
9
+ Then = true,
10
+ Else = false
11
+ > =
12
+ Mode extends 'strict' ? Some.Strict<A, Criteria, Then, Else> :
13
+ number extends A['length'] ? UnionOfValues<A> extends Criteria ? Then : Else :
14
+ A['length'] extends 0 ? Else :
15
+ A[0] extends Criteria ? Then : Some<Tail<A>, Criteria, 'loose', Then, Else>
16
+
17
+ export namespace Some {
18
+ export type Strict<A extends any[], Criteria, Then, Else> =
19
+ number extends A['length']
20
+ ? (Equal<UnionOfValues<A>, Criteria> extends true ? Then : Else)
21
+ : (A['length'] extends 0
22
+ ? Else
23
+ : (Equal<A[0], Criteria> extends true
24
+ ? Then
25
+ : Strict<Tail<A>, Criteria, Then, Else>))
26
+ }