type-plus 4.2.0 → 4.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +71 -70
  2. package/cjs/array/CreateTuple.d.ts +5 -4
  3. package/cjs/array/Some.d.ts +7 -6
  4. package/cjs/functional/compose.d.ts +6 -0
  5. package/cjs/functional/compose.js +21 -0
  6. package/cjs/functional/compose.js.map +1 -0
  7. package/cjs/functional/index.d.ts +1 -0
  8. package/cjs/functional/index.js +15 -0
  9. package/cjs/functional/index.js.map +1 -1
  10. package/cjs/math/Abs.d.ts +1 -1
  11. package/cjs/math/Add.d.ts +14 -10
  12. package/cjs/math/Digit.d.ts +7 -9
  13. package/cjs/math/GreaterThan.d.ts +11 -10
  14. package/cjs/math/Max.d.ts +10 -9
  15. package/cjs/math/Subtract.d.ts +11 -10
  16. package/cjs/math/index.d.ts +1 -0
  17. package/cjs/nodejs/isNodeError.d.ts +1 -2
  18. package/cjs/nodejs/isNodeError.js.map +1 -1
  19. package/cjs/object/split.d.ts +1 -1
  20. package/cjs/utils/as.d.ts +2 -2
  21. package/cjs/utils/as.js +2 -2
  22. package/cjs/utils/as.js.map +1 -1
  23. package/esm/functional/compose.js +7 -0
  24. package/esm/functional/compose.js.map +1 -0
  25. package/esm/functional/index.js +1 -1
  26. package/esm/functional/index.js.map +1 -1
  27. package/esm/nodejs/isNodeError.js.map +1 -1
  28. package/esm/utils/as.js +2 -2
  29. package/esm/utils/as.js.map +1 -1
  30. package/package.json +8 -9
  31. package/ts/array/CreateTuple.ts +6 -4
  32. package/ts/array/Some.ts +26 -24
  33. package/ts/functional/compose.spec.ts +32 -0
  34. package/ts/functional/compose.ts +9 -0
  35. package/ts/functional/index.ts +1 -0
  36. package/ts/math/Abs.ts +4 -4
  37. package/ts/math/Add.ts +52 -49
  38. package/ts/math/Digit.ts +115 -115
  39. package/ts/math/GreaterThan.ts +38 -36
  40. package/ts/math/Max.ts +32 -31
  41. package/ts/math/Subtract.ts +43 -40
  42. package/ts/math/index.ts +1 -0
  43. package/ts/nodejs/isNodeError.ts +1 -2
  44. package/ts/object/split.ts +1 -1
  45. package/ts/utils/as.spec.ts +33 -24
  46. package/ts/utils/as.ts +7 -7
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
+ }
@@ -0,0 +1,32 @@
1
+ import { compose, isType } from '..'
2
+
3
+ test('works with endofunctors: +2 *3', () => {
4
+ const plus2 = (x: number) => x + 2
5
+ const multiply3 = (x: number) => x * 3
6
+
7
+ const a = compose(plus2, multiply3)
8
+
9
+ isType.equal<true, (a: number) => number, typeof a>()
10
+ expect(a(2)).toBe(12)
11
+ })
12
+
13
+ test('cross types', () => {
14
+ const n2s = (n: number) => '' + n
15
+ const len1 = (s: string) => s.length === 1
16
+
17
+ const isSingleDigit = compose(n2s, len1)
18
+
19
+ isType.equal<true, (n: number) => boolean, typeof isSingleDigit>()
20
+ expect(isSingleDigit(1)).toBe(true)
21
+ expect(isSingleDigit(10)).toBe(false)
22
+ })
23
+
24
+ test('multiple params first function', () => {
25
+ const add = (a: number, b: number) => a + b
26
+ const multiply3 = (x: number) => x * 3
27
+
28
+ const a = compose(add, multiply3)
29
+
30
+ isType.equal<true, (a: number, b: number) => number, typeof a>()
31
+ expect(a(2, 2)).toBe(12)
32
+ })
@@ -0,0 +1,9 @@
1
+ import { Head, Last } from '../array'
2
+ import { AnyFunction } from '../function/AnyFunction'
3
+
4
+ /**
5
+ * compose functions
6
+ */
7
+ export function compose<FS extends AnyFunction[]>(...fns: FS): (...args: Parameters<Head<FS>>) => ReturnType<Last<FS>> {
8
+ return (...args: any[]) => fns.reduce((args, fn) => [fn(...args)], args)[0] as any
9
+ }
@@ -1,2 +1,3 @@
1
1
  // export * from './Maybe'
2
2
  export type { ChainFn, EndoFn } from './ChainFn'
3
+ export * from './compose'
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
- import { Digit, DigitArray } from './Digit'
4
- import { IsPositive } from './IsPositive'
5
- import { IsWhole } from './IsWhole'
6
- import { Max } from './Max'
7
-
8
- /**
9
- * Add two number literals.
10
- */
11
- export type Add<A extends number, B extends number, Fail = never> =
12
- And<
13
- And<IsPositive<A>, IsWhole<A>>,
14
- And<IsPositive<B>, IsWhole<B>>
15
- > extends false ? Fail :
16
- DigitArray.FromNumber<A> extends infer DA ? DA extends number[] ?
17
- DigitArray.FromNumber<B> extends infer DB ? DB extends number[] ?
18
- Max<DA['length'], DB['length']> extends infer M ? M extends number ?
19
- PadLeft<DA, M, 0> extends infer PDA ? PDA extends number[] ?
20
- PadLeft<DB, M, 0> extends infer PDB ? PDB extends number[] ?
21
- DigitArray.ToNumber<AddDigitArray<PDA, PDB>>
22
- : Fail : Fail
23
- : Fail : Fail
24
- : Fail : Fail
25
- : Fail : Fail
26
- : Fail : Fail
27
-
28
- type AddDigitArray<A extends number[], B extends number[]> = (
29
- A extends [any, ...infer ATail]
30
- ? (ATail extends number[]
31
- ? (B extends [any, ...infer BTail]
32
- ? (BTail extends number[]
33
- ? [AddDigit<A[0], B[0]>, ...AddDigitArray<ATail, BTail>]
34
- : [])
35
- : [A[0], ...AddDigitArray<[], ATail>])
36
- : [])
37
- : (B extends [any, ...infer BTail]
38
- ? (BTail extends number[]
39
- ? [B[0], ...AddDigitArray<[], BTail>]
40
- : [])
41
- : [])
42
- )
43
-
44
- type AddDigit<A extends number, B extends number> = [...Digit.ToTuple[A], ...Digit.ToTuple[B]]['length']
45
-
46
- /**
47
- * Increment `A` by 1.
48
- */
49
- export type Increment<A extends number, Fail = never> = Add<A, 1, Fail>
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
+ }
@@ -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
- GreaterThanOnPositiveWhole<A, B>
17
-
18
- type GreaterThanOnPositiveWhole<A extends number, B extends number> = (
19
- DigitArray.FromNumber<A> extends infer DA ? DA extends number[] ?
20
- DigitArray.FromNumber<B> extends infer DB ? DB extends number[] ?
21
- Max<DA['length'], DB['length']> extends infer M ? M extends number ?
22
- PadLeft<DA, M, 0> extends infer PDA ? PDA extends number[] ?
23
- PadLeft<DB, M, 0> extends infer PDB ? PDB extends number[] ?
24
- GreaterThanOnDigitArray<PDA, PDB>
25
- : never : never
26
- : never : never
27
- : never : never
28
- : never : never
29
- : never : never
30
- )
31
-
32
- type GreaterThanOnDigitArray<DA extends number[], DB extends number[]> = (
33
- Equal<Head<DA>, Head<DB>> extends true ?
34
- GreaterThanOnDigitArray<Tail<DA>, Tail<DB>> extends Tail<DA> ? true : false :
35
- Digit.GreaterThan<Head<DA>, Head<DB>> extends true ? true : false
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
- MaxOnPositiveWhole<A, B>
14
-
15
- type MaxOnPositiveWhole<A extends number, B extends number> = (
16
- DigitArray.FromNumber<A> extends infer DA ? DA extends number[] ?
17
- DigitArray.FromNumber<B> extends infer DB ? DB extends number[] ?
18
- MaxOnDigitArray<DA, DB> extends DA ? A : B
19
- : never : never
20
- : never : never
21
- )
22
-
23
- type MaxOnDigitArray<DA extends number[], DB extends number[]> =
24
- Equal<DA['length'], DB['length']> extends true
25
- ? (Equal<Head<DA>, Head<DB>> extends true
26
- ? (Tail<DA> extends infer TDA ? TDA extends number[] ?
27
- MaxOnDigitArray<TDA, Tail<DB>> extends TDA ? DA : DB
28
- : never : never)
29
- : Digit.GreaterThan<Head<DA>, Head<DB>> extends true ? DA : DB)
30
- : MaxOnPositiveWhole<DA['length'], DB['length']> extends DA['length'] ? DA : DB
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
+ }