type-plus 4.3.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.
- package/cjs/array/CreateTuple.d.ts +5 -4
- package/cjs/array/Some.d.ts +7 -6
- package/cjs/math/Abs.d.ts +1 -1
- package/cjs/math/Add.d.ts +14 -10
- package/cjs/math/Digit.d.ts +7 -9
- package/cjs/math/GreaterThan.d.ts +11 -10
- package/cjs/math/Max.d.ts +10 -9
- package/cjs/math/Subtract.d.ts +11 -10
- package/cjs/math/index.d.ts +1 -0
- package/cjs/nodejs/isNodeError.d.ts +1 -2
- package/cjs/nodejs/isNodeError.js.map +1 -1
- package/cjs/object/split.d.ts +1 -1
- package/esm/nodejs/isNodeError.js.map +1 -1
- package/package.json +5 -3
- package/ts/array/CreateTuple.ts +6 -4
- package/ts/array/Some.ts +26 -24
- package/ts/math/Abs.ts +4 -4
- package/ts/math/Add.ts +52 -49
- package/ts/math/Digit.ts +115 -115
- package/ts/math/GreaterThan.ts +38 -36
- package/ts/math/Max.ts +32 -31
- package/ts/math/Subtract.ts +43 -40
- package/ts/math/index.ts +1 -0
- package/ts/nodejs/isNodeError.ts +1 -2
- package/ts/object/split.ts +1 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { IsPositive } from '../math';
|
|
1
|
+
import type { IsPositive } from '../math';
|
|
2
2
|
/**
|
|
3
3
|
* Creates `Tuple<T>` with `L` number of elements.
|
|
4
4
|
*/
|
|
5
|
-
export declare type CreateTuple<L extends number, T = any> = IsPositive<L> extends true ? Device<[], L, T> : never;
|
|
6
|
-
declare
|
|
7
|
-
|
|
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
|
+
}
|
package/cjs/array/Some.d.ts
CHANGED
|
@@ -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' ?
|
|
5
|
-
declare
|
|
6
|
-
|
|
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
|
+
}
|
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<
|
|
11
|
-
declare
|
|
12
|
-
|
|
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 {};
|
package/cjs/math/Digit.d.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
52
|
-
|
|
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
|
-
|
|
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
|
-
|
|
57
|
-
|
|
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 :
|
|
8
|
-
declare
|
|
9
|
-
|
|
10
|
-
|
|
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 :
|
|
7
|
-
declare
|
|
8
|
-
|
|
9
|
-
|
|
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
|
+
}
|
package/cjs/math/Subtract.d.ts
CHANGED
|
@@ -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[] ?
|
|
8
|
-
declare
|
|
9
|
-
|
|
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 {};
|
package/cjs/math/index.d.ts
CHANGED
|
@@ -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":";;;
|
|
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"}
|
package/cjs/object/split.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ 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
8
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isNodeError.js","sourceRoot":"","sources":["../../ts/nodejs/isNodeError.ts"],"names":[],"mappings":"
|
|
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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "type-plus",
|
|
3
|
-
"version": "4.3.
|
|
4
|
-
"description": "Provides additional types for
|
|
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": [
|
package/ts/array/CreateTuple.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { IsPositive } from '../math'
|
|
1
|
+
import type { IsPositive } from '../math'
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Creates `Tuple<T>` with `L` number of elements.
|
|
5
5
|
*/
|
|
6
6
|
export type CreateTuple<L extends number, T = any> =
|
|
7
|
-
IsPositive<L> extends true ? Device<[], L, T> : never
|
|
7
|
+
IsPositive<L> extends true ? CreateTuple.Device<[], L, T> : never
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
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
|
+
}
|
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' ?
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
+
}
|
package/ts/math/Abs.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DigitArray } from './Digit'
|
|
2
|
-
|
|
3
|
-
export type Abs<N extends number, Fail = never> = number extends N ? Fail :
|
|
4
|
-
`${N}` extends `-${infer P}` ? DigitArray.ToNumber<DigitArray.FromString<P>> : N
|
|
1
|
+
import type { DigitArray } from './Digit'
|
|
2
|
+
|
|
3
|
+
export type Abs<N extends number, Fail = never> = number extends N ? Fail :
|
|
4
|
+
`${N}` extends `-${infer P}` ? DigitArray.ToNumber<DigitArray.FromString<P>> : N
|
package/ts/math/Add.ts
CHANGED
|
@@ -1,49 +1,52 @@
|
|
|
1
|
-
import { PadLeft } from '../array'
|
|
2
|
-
import { And } from '../predicates'
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
And<IsPositive<
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
DigitArray.FromNumber<
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
PadLeft<
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
: Fail : Fail
|
|
24
|
-
: Fail : Fail
|
|
25
|
-
: Fail : Fail
|
|
26
|
-
: Fail : Fail
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
)
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
1
|
+
import type { PadLeft } from '../array'
|
|
2
|
+
import type { And } from '../predicates'
|
|
3
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
4
|
+
import type { Digit, DigitArray } from './Digit'
|
|
5
|
+
import type { IsPositive } from './IsPositive'
|
|
6
|
+
import type { IsWhole } from './IsWhole'
|
|
7
|
+
import type { Max } from './Max'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Add two number literals.
|
|
11
|
+
*/
|
|
12
|
+
export type Add<A extends number, B extends number, Fail = never> =
|
|
13
|
+
And<
|
|
14
|
+
And<IsPositive<A>, IsWhole<A>>,
|
|
15
|
+
And<IsPositive<B>, IsWhole<B>>
|
|
16
|
+
> extends false ? Fail :
|
|
17
|
+
DigitArray.FromNumber<A> extends infer DA ? DA extends number[] ?
|
|
18
|
+
DigitArray.FromNumber<B> extends infer DB ? DB extends number[] ?
|
|
19
|
+
Max<DA['length'], DB['length']> extends infer M ? M extends number ?
|
|
20
|
+
PadLeft<DA, M, 0> extends infer PDA ? PDA extends number[] ?
|
|
21
|
+
PadLeft<DB, M, 0> extends infer PDB ? PDB extends number[] ?
|
|
22
|
+
DigitArray.ToNumber<Add.DigitArray<PDA, PDB>>
|
|
23
|
+
: Fail : Fail
|
|
24
|
+
: Fail : Fail
|
|
25
|
+
: Fail : Fail
|
|
26
|
+
: Fail : Fail
|
|
27
|
+
: Fail : Fail
|
|
28
|
+
|
|
29
|
+
export namespace Add {
|
|
30
|
+
export type DigitArray<A extends number[], B extends number[]> = (
|
|
31
|
+
A extends [any, ...infer ATail]
|
|
32
|
+
? (ATail extends number[]
|
|
33
|
+
? (B extends [any, ...infer BTail]
|
|
34
|
+
? (BTail extends number[]
|
|
35
|
+
? [Digit<A[0], B[0]>, ...DigitArray<ATail, BTail>]
|
|
36
|
+
: [])
|
|
37
|
+
: [A[0], ...DigitArray<[], ATail>])
|
|
38
|
+
: [])
|
|
39
|
+
: (B extends [any, ...infer BTail]
|
|
40
|
+
? (BTail extends number[]
|
|
41
|
+
? [B[0], ...DigitArray<[], BTail>]
|
|
42
|
+
: [])
|
|
43
|
+
: [])
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
export type Digit<A extends number, B extends number> =
|
|
47
|
+
[...Digit.ToTuple[A], ...Digit.ToTuple[B]]['length']
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Increment `A` by 1.
|
|
51
|
+
*/
|
|
52
|
+
export type Increment<A extends number, Fail = never> = Add<A, 1, Fail>
|
package/ts/math/Digit.ts
CHANGED
|
@@ -1,115 +1,115 @@
|
|
|
1
|
-
import { Tail } from '../array'
|
|
2
|
-
import { And } from '../predicates'
|
|
3
|
-
import { IsPositive } from './IsPositive'
|
|
4
|
-
import { IsWhole } from './IsWhole'
|
|
5
|
-
|
|
6
|
-
export namespace Digit {
|
|
7
|
-
export type ToTuple = {
|
|
8
|
-
[k in number]: any[]
|
|
9
|
-
} & {
|
|
10
|
-
0: [],
|
|
11
|
-
1: [1],
|
|
12
|
-
2: [1, 1],
|
|
13
|
-
3: [1, 1, 1],
|
|
14
|
-
4: [1, 1, 1, 1],
|
|
15
|
-
5: [1, 1, 1, 1, 1],
|
|
16
|
-
6: [1, 1, 1, 1, 1, 1],
|
|
17
|
-
7: [1, 1, 1, 1, 1, 1, 1],
|
|
18
|
-
8: [1, 1, 1, 1, 1, 1, 1, 1],
|
|
19
|
-
9: [1, 1, 1, 1, 1, 1, 1, 1, 1],
|
|
20
|
-
10: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
|
21
|
-
11: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
|
22
|
-
12: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
|
23
|
-
13: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
|
24
|
-
14: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
|
25
|
-
15: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
|
26
|
-
16: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
|
27
|
-
17: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
|
28
|
-
18: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
|
29
|
-
19: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* A > B for [1-9]
|
|
34
|
-
*/
|
|
35
|
-
export type GreaterThan<A extends number, B extends number> = B extends GreaterThanMap[A] ? true : false
|
|
36
|
-
|
|
37
|
-
type GreaterThanMap = { [k in number]: number } & {
|
|
38
|
-
0: never,
|
|
39
|
-
1: 0,
|
|
40
|
-
2: 0 | 1,
|
|
41
|
-
3: 0 | 1 | 2,
|
|
42
|
-
4: 0 | 1 | 2 | 3,
|
|
43
|
-
5: 0 | 1 | 2 | 3 | 4,
|
|
44
|
-
6: 0 | 1 | 2 | 3 | 4 | 5,
|
|
45
|
-
7: 0 | 1 | 2 | 3 | 4 | 5 | 6,
|
|
46
|
-
8: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7,
|
|
47
|
-
9: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8,
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export namespace DigitArray {
|
|
52
|
-
export type ToNumber<C extends number[]> = ToTuple<[], C>['length']
|
|
53
|
-
|
|
54
|
-
export type ToTuple<R extends any[], S extends number[]> =
|
|
55
|
-
S['length'] extends 0
|
|
56
|
-
? R
|
|
57
|
-
: (S['length'] extends 1
|
|
58
|
-
? [...R, ...Digit.ToTuple[S[0]]]
|
|
59
|
-
: (S extends [any, ...infer T]
|
|
60
|
-
? (T extends any[]
|
|
61
|
-
? ToTuple<Multi10<[...R, ...Digit.ToTuple[S[0]]]>, T>
|
|
62
|
-
: never)
|
|
63
|
-
: never))
|
|
64
|
-
|
|
65
|
-
type Multi10<C extends any[]> = [...C, ...C, ...C, ...C, ...C, ...C, ...C, ...C, ...C, ...C]
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
export type FromNumber<N extends number> = FromString<NumberToString<N>>
|
|
69
|
-
|
|
70
|
-
type NumberToString<N extends number> = (And<IsPositive<N>, IsWhole<N>>) extends true ? `${N}` : never
|
|
71
|
-
|
|
72
|
-
export type FromString<S extends string> = S extends `1${infer L}` ? [1, ...FromString<L>]
|
|
73
|
-
: S extends `2${infer L}` ? [2, ...FromString<L>]
|
|
74
|
-
: S extends `3${infer L}` ? [3, ...FromString<L>]
|
|
75
|
-
: S extends `4${infer L}` ? [4, ...FromString<L>]
|
|
76
|
-
: S extends `5${infer L}` ? [5, ...FromString<L>]
|
|
77
|
-
: S extends `6${infer L}` ? [6, ...FromString<L>]
|
|
78
|
-
: S extends `7${infer L}` ? [7, ...FromString<L>]
|
|
79
|
-
: S extends `8${infer L}` ? [8, ...FromString<L>]
|
|
80
|
-
: S extends `9${infer L}` ? [9, ...FromString<L>]
|
|
81
|
-
: S extends `0${infer L}` ? [0, ...FromString<L>]
|
|
82
|
-
: []
|
|
83
|
-
|
|
84
|
-
export type Shift10<DA extends number[]> = TrimLeadingZero<Shift10State<[], DA>>
|
|
85
|
-
type Shift10State<R extends number[], DA extends number[]> =
|
|
86
|
-
DA['length'] extends 0
|
|
87
|
-
? R
|
|
88
|
-
: (DA['length'] extends 1
|
|
89
|
-
? [...R, ...DA]
|
|
90
|
-
: (DA extends [any, ...infer T]
|
|
91
|
-
? (T extends number[]
|
|
92
|
-
? (DA[0] extends 0
|
|
93
|
-
? Shift10State<[...R, DA[0]], T>
|
|
94
|
-
: (T extends [any, ...infer Y]
|
|
95
|
-
? (Y extends number[]
|
|
96
|
-
? Shift10State<[...R, MinusOne[DA[0]]], [Plus10[T[0]], ...Y]>
|
|
97
|
-
: [])
|
|
98
|
-
: []))
|
|
99
|
-
: [])
|
|
100
|
-
: [])
|
|
101
|
-
)
|
|
102
|
-
|
|
103
|
-
type TrimLeadingZero<A extends number[]> =
|
|
104
|
-
A['length'] extends 0
|
|
105
|
-
? A
|
|
106
|
-
: A[0] extends 0 ? TrimLeadingZero<Tail<A>> : A
|
|
107
|
-
|
|
108
|
-
type MinusOne = { [k in number]: number } & {
|
|
109
|
-
0: 0, 1: 0, 2: 1, 3: 2, 4: 3, 5: 4, 6: 5, 7: 6, 8: 7, 9: 8,
|
|
110
|
-
10: 9, 11: 10, 12: 11, 13: 12, 14: 13, 15: 14, 16: 15, 17: 16, 18: 17, 19: 18
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
type Plus10 = { [k in number]: number } &
|
|
114
|
-
{ 0: 10, 1: 11, 2: 12, 3: 13, 4: 14, 5: 15, 6: 16, 7: 17, 8: 18, 9: 19 }
|
|
115
|
-
}
|
|
1
|
+
import { Tail } from '../array'
|
|
2
|
+
import { And } from '../predicates'
|
|
3
|
+
import { IsPositive } from './IsPositive'
|
|
4
|
+
import { IsWhole } from './IsWhole'
|
|
5
|
+
|
|
6
|
+
export namespace Digit {
|
|
7
|
+
export type ToTuple = {
|
|
8
|
+
[k in number]: any[]
|
|
9
|
+
} & {
|
|
10
|
+
0: [],
|
|
11
|
+
1: [1],
|
|
12
|
+
2: [1, 1],
|
|
13
|
+
3: [1, 1, 1],
|
|
14
|
+
4: [1, 1, 1, 1],
|
|
15
|
+
5: [1, 1, 1, 1, 1],
|
|
16
|
+
6: [1, 1, 1, 1, 1, 1],
|
|
17
|
+
7: [1, 1, 1, 1, 1, 1, 1],
|
|
18
|
+
8: [1, 1, 1, 1, 1, 1, 1, 1],
|
|
19
|
+
9: [1, 1, 1, 1, 1, 1, 1, 1, 1],
|
|
20
|
+
10: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
|
21
|
+
11: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
|
22
|
+
12: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
|
23
|
+
13: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
|
24
|
+
14: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
|
25
|
+
15: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
|
26
|
+
16: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
|
27
|
+
17: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
|
28
|
+
18: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
|
29
|
+
19: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* A > B for [1-9]
|
|
34
|
+
*/
|
|
35
|
+
export type GreaterThan<A extends number, B extends number> = B extends GreaterThanMap[A] ? true : false
|
|
36
|
+
|
|
37
|
+
export type GreaterThanMap = { [k in number]: number } & {
|
|
38
|
+
0: never,
|
|
39
|
+
1: 0,
|
|
40
|
+
2: 0 | 1,
|
|
41
|
+
3: 0 | 1 | 2,
|
|
42
|
+
4: 0 | 1 | 2 | 3,
|
|
43
|
+
5: 0 | 1 | 2 | 3 | 4,
|
|
44
|
+
6: 0 | 1 | 2 | 3 | 4 | 5,
|
|
45
|
+
7: 0 | 1 | 2 | 3 | 4 | 5 | 6,
|
|
46
|
+
8: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7,
|
|
47
|
+
9: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8,
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export namespace DigitArray {
|
|
52
|
+
export type ToNumber<C extends number[]> = ToTuple<[], C>['length']
|
|
53
|
+
|
|
54
|
+
export type ToTuple<R extends any[], S extends number[]> =
|
|
55
|
+
S['length'] extends 0
|
|
56
|
+
? R
|
|
57
|
+
: (S['length'] extends 1
|
|
58
|
+
? [...R, ...Digit.ToTuple[S[0]]]
|
|
59
|
+
: (S extends [any, ...infer T]
|
|
60
|
+
? (T extends any[]
|
|
61
|
+
? ToTuple<Multi10<[...R, ...Digit.ToTuple[S[0]]]>, T>
|
|
62
|
+
: never)
|
|
63
|
+
: never))
|
|
64
|
+
|
|
65
|
+
export type Multi10<C extends any[]> = [...C, ...C, ...C, ...C, ...C, ...C, ...C, ...C, ...C, ...C]
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
export type FromNumber<N extends number> = FromString<NumberToString<N>>
|
|
69
|
+
|
|
70
|
+
export type NumberToString<N extends number> = (And<IsPositive<N>, IsWhole<N>>) extends true ? `${N}` : never
|
|
71
|
+
|
|
72
|
+
export type FromString<S extends string> = S extends `1${infer L}` ? [1, ...FromString<L>]
|
|
73
|
+
: S extends `2${infer L}` ? [2, ...FromString<L>]
|
|
74
|
+
: S extends `3${infer L}` ? [3, ...FromString<L>]
|
|
75
|
+
: S extends `4${infer L}` ? [4, ...FromString<L>]
|
|
76
|
+
: S extends `5${infer L}` ? [5, ...FromString<L>]
|
|
77
|
+
: S extends `6${infer L}` ? [6, ...FromString<L>]
|
|
78
|
+
: S extends `7${infer L}` ? [7, ...FromString<L>]
|
|
79
|
+
: S extends `8${infer L}` ? [8, ...FromString<L>]
|
|
80
|
+
: S extends `9${infer L}` ? [9, ...FromString<L>]
|
|
81
|
+
: S extends `0${infer L}` ? [0, ...FromString<L>]
|
|
82
|
+
: []
|
|
83
|
+
|
|
84
|
+
export type Shift10<DA extends number[]> = TrimLeadingZero<Shift10State<[], DA>>
|
|
85
|
+
export type Shift10State<R extends number[], DA extends number[]> =
|
|
86
|
+
DA['length'] extends 0
|
|
87
|
+
? R
|
|
88
|
+
: (DA['length'] extends 1
|
|
89
|
+
? [...R, ...DA]
|
|
90
|
+
: (DA extends [any, ...infer T]
|
|
91
|
+
? (T extends number[]
|
|
92
|
+
? (DA[0] extends 0
|
|
93
|
+
? Shift10State<[...R, DA[0]], T>
|
|
94
|
+
: (T extends [any, ...infer Y]
|
|
95
|
+
? (Y extends number[]
|
|
96
|
+
? Shift10State<[...R, MinusOne[DA[0]]], [Plus10[T[0]], ...Y]>
|
|
97
|
+
: [])
|
|
98
|
+
: []))
|
|
99
|
+
: [])
|
|
100
|
+
: [])
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
export type TrimLeadingZero<A extends number[]> =
|
|
104
|
+
A['length'] extends 0
|
|
105
|
+
? A
|
|
106
|
+
: A[0] extends 0 ? TrimLeadingZero<Tail<A>> : A
|
|
107
|
+
|
|
108
|
+
export type MinusOne = { [k in number]: number } & {
|
|
109
|
+
0: 0, 1: 0, 2: 1, 3: 2, 4: 3, 5: 4, 6: 5, 7: 6, 8: 7, 9: 8,
|
|
110
|
+
10: 9, 11: 10, 12: 11, 13: 12, 14: 13, 15: 14, 16: 15, 17: 16, 18: 17, 19: 18
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export type Plus10 = { [k in number]: number } &
|
|
114
|
+
{ 0: 10, 1: 11, 2: 12, 3: 13, 4: 14, 5: 15, 6: 16, 7: 17, 8: 18, 9: 19 }
|
|
115
|
+
}
|
package/ts/math/GreaterThan.ts
CHANGED
|
@@ -1,36 +1,38 @@
|
|
|
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
|
-
|
|
8
|
-
export type GreaterThan<A extends number, B extends number, Fail = never> =
|
|
9
|
-
And<
|
|
10
|
-
And<IsPositive<A>, IsWhole<A>>,
|
|
11
|
-
And<IsPositive<B>, IsWhole<B>>
|
|
12
|
-
> extends false ? Fail :
|
|
13
|
-
number extends A ? Fail :
|
|
14
|
-
number extends B ? Fail :
|
|
15
|
-
Equal<A, B> extends true ? false :
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
+
|
|
8
|
+
export type GreaterThan<A extends number, B extends number, Fail = never> =
|
|
9
|
+
And<
|
|
10
|
+
And<IsPositive<A>, IsWhole<A>>,
|
|
11
|
+
And<IsPositive<B>, IsWhole<B>>
|
|
12
|
+
> extends false ? Fail :
|
|
13
|
+
number extends A ? Fail :
|
|
14
|
+
number extends B ? Fail :
|
|
15
|
+
Equal<A, B> extends true ? false :
|
|
16
|
+
GreaterThan.OnPositiveWhole<A, B>
|
|
17
|
+
|
|
18
|
+
export namespace GreaterThan {
|
|
19
|
+
export type OnPositiveWhole<A extends number, B extends number> = (
|
|
20
|
+
DigitArray.FromNumber<A> extends infer DA ? DA extends number[] ?
|
|
21
|
+
DigitArray.FromNumber<B> extends infer DB ? DB extends number[] ?
|
|
22
|
+
Max<DA['length'], DB['length']> extends infer M ? M extends number ?
|
|
23
|
+
PadLeft<DA, M, 0> extends infer PDA ? PDA extends number[] ?
|
|
24
|
+
PadLeft<DB, M, 0> extends infer PDB ? PDB extends number[] ?
|
|
25
|
+
OnDigitArray<PDA, PDB>
|
|
26
|
+
: never : never
|
|
27
|
+
: never : never
|
|
28
|
+
: never : never
|
|
29
|
+
: never : never
|
|
30
|
+
: never : never
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
export type OnDigitArray<DA extends number[], DB extends number[]> = (
|
|
34
|
+
Equal<Head<DA>, Head<DB>> extends true ?
|
|
35
|
+
OnDigitArray<Tail<DA>, Tail<DB>> extends Tail<DA> ? true : false :
|
|
36
|
+
Digit.GreaterThan<Head<DA>, Head<DB>> extends true ? true : false
|
|
37
|
+
)
|
|
38
|
+
}
|
package/ts/math/Max.ts
CHANGED
|
@@ -1,31 +1,32 @@
|
|
|
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
|
-
|
|
7
|
-
export type Max<A extends number, B extends number, Fail = never> =
|
|
8
|
-
And<IsPositive<A>, IsWhole<A>> extends false ? Fail :
|
|
9
|
-
And<IsPositive<B>, IsWhole<B>> extends false ? Fail :
|
|
10
|
-
number extends A ? Fail :
|
|
11
|
-
number extends B ? Fail :
|
|
12
|
-
Equal<A, B> extends true ? A :
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
? (
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
+
|
|
7
|
+
export type Max<A extends number, B extends number, Fail = never> =
|
|
8
|
+
And<IsPositive<A>, IsWhole<A>> extends false ? Fail :
|
|
9
|
+
And<IsPositive<B>, IsWhole<B>> extends false ? Fail :
|
|
10
|
+
number extends A ? Fail :
|
|
11
|
+
number extends B ? Fail :
|
|
12
|
+
Equal<A, B> extends true ? A :
|
|
13
|
+
Max.OnPositiveWhole<A, B>
|
|
14
|
+
|
|
15
|
+
export namespace Max {
|
|
16
|
+
export type OnPositiveWhole<A extends number, B extends number> = (
|
|
17
|
+
DigitArray.FromNumber<A> extends infer DA ? DA extends number[] ?
|
|
18
|
+
DigitArray.FromNumber<B> extends infer DB ? DB extends number[] ?
|
|
19
|
+
OnDigitArray<DA, DB> extends DA ? A : B
|
|
20
|
+
: never : never
|
|
21
|
+
: never : never
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
export type OnDigitArray<DA extends number[], DB extends number[]> =
|
|
25
|
+
Equal<DA['length'], DB['length']> extends true
|
|
26
|
+
? (Equal<Head<DA>, Head<DB>> extends true
|
|
27
|
+
? (Tail<DA> extends infer TDA ? TDA extends number[] ?
|
|
28
|
+
OnDigitArray<TDA, Tail<DB>> extends TDA ? DA : DB
|
|
29
|
+
: never : never)
|
|
30
|
+
: Digit.GreaterThan<Head<DA>, Head<DB>> extends true ? DA : DB)
|
|
31
|
+
: OnPositiveWhole<DA['length'], DB['length']> extends DA['length'] ? DA : DB
|
|
32
|
+
}
|
package/ts/math/Subtract.ts
CHANGED
|
@@ -1,40 +1,43 @@
|
|
|
1
|
-
import { PadLeft, Some, Tail } from '../array'
|
|
2
|
-
import { And } from '../predicates'
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
And<IsPositive<
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
PadLeft<
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
: Fail : Fail
|
|
23
|
-
: Fail : Fail
|
|
24
|
-
: Fail : Fail
|
|
25
|
-
: Fail : Fail
|
|
26
|
-
: Fail : Fail
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
1
|
+
import type { PadLeft, Some, Tail } from '../array'
|
|
2
|
+
import type { And } from '../predicates'
|
|
3
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
4
|
+
import type { Digit, DigitArray } from './Digit'
|
|
5
|
+
import type { IsPositive } from './IsPositive'
|
|
6
|
+
import type { IsWhole } from './IsWhole'
|
|
7
|
+
import type { Max } from './Max'
|
|
8
|
+
|
|
9
|
+
export type Subtract<A extends number, B extends number, Fail = never> =
|
|
10
|
+
And<
|
|
11
|
+
And<IsPositive<A>, IsWhole<A>>,
|
|
12
|
+
And<IsPositive<B>, IsWhole<B>>
|
|
13
|
+
> extends true
|
|
14
|
+
? (DigitArray.Shift10<DigitArray.FromNumber<A>> extends infer DA ? DA extends number[] ?
|
|
15
|
+
DigitArray.FromNumber<B> extends infer DB ? DB extends number[] ?
|
|
16
|
+
Max<DA['length'], DB['length']> extends infer M ? M extends number ?
|
|
17
|
+
PadLeft<DA, M, 0> extends infer PDA ? PDA extends number[] ?
|
|
18
|
+
PadLeft<DB, M, 0> extends infer PDB ? PDB extends number[] ?
|
|
19
|
+
Subtract.DigitArray<[], PDA, PDB> extends infer Result ? Result extends number[] ?
|
|
20
|
+
Some<Result, never, 'strict'> extends true ? Fail :
|
|
21
|
+
DigitArray.ToNumber<Result>
|
|
22
|
+
: Fail : Fail
|
|
23
|
+
: Fail : Fail
|
|
24
|
+
: Fail : Fail
|
|
25
|
+
: Fail : Fail
|
|
26
|
+
: Fail : Fail
|
|
27
|
+
: Fail : Fail)
|
|
28
|
+
: Fail
|
|
29
|
+
|
|
30
|
+
export namespace Subtract {
|
|
31
|
+
export type DigitArray<R extends number[], A extends number[], B extends number[]> =
|
|
32
|
+
A['length'] extends 0 ? R :
|
|
33
|
+
DigitArray<[...R, Digit<A[0], B[0]>], Tail<A>, Tail<B>>
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
export type Digit<A extends number, B extends number> =
|
|
37
|
+
Digit.ToTuple[A] extends [...(infer U), ...Digit.ToTuple[B]] ? U['length'] : never
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* A - 1
|
|
42
|
+
*/
|
|
43
|
+
export type Decrement<A extends number, Fail = never> = Subtract<A, 1, Fail>
|
package/ts/math/index.ts
CHANGED
|
@@ -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'
|
package/ts/nodejs/isNodeError.ts
CHANGED
package/ts/object/split.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AnyRecord, Omit, reduceByKey } from '..'
|
|
2
2
|
|
|
3
3
|
type Splitter<T extends AnyRecord> = Partial<{ [k in keyof T]: T[k] | undefined }>
|
|
4
|
-
type Split<T extends AnyRecord, S extends AnyRecord> = { [k in keyof S]: NonNullable<T[k]> | S[k] }
|
|
4
|
+
export type Split<T extends AnyRecord, S extends AnyRecord> = { [k in keyof S]: NonNullable<T[k]> | S[k] }
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Split an object into multiple objects.
|