From 22db82d40be73dcd5f3cd590de7eaffdba96c874 Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Tue, 25 Jun 2019 14:59:21 -0700 Subject: [PATCH 1/2] Allow `infer` type variables to have constraints infered and allow the breakdown of substitutes in simplifiable source inferences --- src/compiler/checker.ts | 25 +++++++++++++------ ...substituteReturnTypeSatisfiesConstraint.js | 8 ++++++ ...ituteReturnTypeSatisfiesConstraint.symbols | 25 +++++++++++++++++++ ...stituteReturnTypeSatisfiesConstraint.types | 15 +++++++++++ ...substituteReturnTypeSatisfiesConstraint.ts | 4 +++ 5 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 tests/baselines/reference/substituteReturnTypeSatisfiesConstraint.js create mode 100644 tests/baselines/reference/substituteReturnTypeSatisfiesConstraint.symbols create mode 100644 tests/baselines/reference/substituteReturnTypeSatisfiesConstraint.types create mode 100644 tests/cases/compiler/substituteReturnTypeSatisfiesConstraint.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 92df91d00841f..553bb4da93d09 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -10312,6 +10312,13 @@ namespace ts { } } + function unwrapSubstitution(type: Type): Type { + if (type.flags & TypeFlags.Substitution) { + return (type as SubstitutionType).substitute; + } + return type; + } + // Transform an indexed access to a simpler form, if possible. Return the simpler form, or return // the type itself if no transformation is possible. The writing flag indicates that the type is // the target of an assignment. @@ -10323,7 +10330,7 @@ namespace ts { type[cache] = circularConstraintType; // We recursively simplify the object type as it may in turn be an indexed access type. For example, with // '{ [P in T]: { [Q in U]: number } }[T][U]' we want to first simplify the inner indexed access type. - const objectType = getSimplifiedType(type.objectType, writing); + const objectType = unwrapSubstitution(getSimplifiedType(type.objectType, writing)); const indexType = getSimplifiedType(type.indexType, writing); // T[A | B] -> T[A] | T[B] (reading) // T[A | B] -> T[A] & T[B] (writing) @@ -10501,12 +10508,10 @@ namespace ts { let combinedMapper: TypeMapper | undefined; if (root.inferTypeParameters) { const context = createInferenceContext(root.inferTypeParameters, /*signature*/ undefined, InferenceFlags.None); - if (!checkTypeInstantiable) { - // We don't want inferences from constraints as they may cause us to eagerly resolve the - // conditional type instead of deferring resolution. Also, we always want strict function - // types rules (i.e. proper contravariance) for inferences. - inferTypes(context.inferences, checkType, extendsType, InferencePriority.NoConstraints | InferencePriority.AlwaysStrict); - } + // We don't want inferences from constraints as they may cause us to eagerly resolve the + // conditional type instead of deferring resolution. Also, we always want strict function + // types rules (i.e. proper contravariance) for inferences. + inferTypes(context.inferences, checkType, extendsType, InferencePriority.NoConstraints | InferencePriority.AlwaysStrict); combinedMapper = combineTypeMappers(mapper, context.mapper); } // Instantiate the extends type including inferences for 'infer T' type parameters @@ -15437,6 +15442,12 @@ namespace ts { } } } + if (source.flags & TypeFlags.Simplifiable) { + const simplified = getSimplifiedType(source, contravariant); + if (simplified !== source) { + inferFromTypes(simplified, target); + } + } function inferFromTypesOnce(source: Type, target: Type) { const key = source.id + "," + target.id; diff --git a/tests/baselines/reference/substituteReturnTypeSatisfiesConstraint.js b/tests/baselines/reference/substituteReturnTypeSatisfiesConstraint.js new file mode 100644 index 0000000000000..47c06120cbfcb --- /dev/null +++ b/tests/baselines/reference/substituteReturnTypeSatisfiesConstraint.js @@ -0,0 +1,8 @@ +//// [substituteReturnTypeSatisfiesConstraint.ts] +type M = { p: string }; +type O = { m: () => M }; +type X = T; +type FFG = T extends O ? X> : never; // error! + + +//// [substituteReturnTypeSatisfiesConstraint.js] diff --git a/tests/baselines/reference/substituteReturnTypeSatisfiesConstraint.symbols b/tests/baselines/reference/substituteReturnTypeSatisfiesConstraint.symbols new file mode 100644 index 0000000000000..804313beba991 --- /dev/null +++ b/tests/baselines/reference/substituteReturnTypeSatisfiesConstraint.symbols @@ -0,0 +1,25 @@ +=== tests/cases/compiler/substituteReturnTypeSatisfiesConstraint.ts === +type M = { p: string }; +>M : Symbol(M, Decl(substituteReturnTypeSatisfiesConstraint.ts, 0, 0)) +>p : Symbol(p, Decl(substituteReturnTypeSatisfiesConstraint.ts, 0, 10)) + +type O = { m: () => M }; +>O : Symbol(O, Decl(substituteReturnTypeSatisfiesConstraint.ts, 0, 23)) +>m : Symbol(m, Decl(substituteReturnTypeSatisfiesConstraint.ts, 1, 10)) +>M : Symbol(M, Decl(substituteReturnTypeSatisfiesConstraint.ts, 0, 0)) + +type X = T; +>X : Symbol(X, Decl(substituteReturnTypeSatisfiesConstraint.ts, 1, 24)) +>T : Symbol(T, Decl(substituteReturnTypeSatisfiesConstraint.ts, 2, 7)) +>M : Symbol(M, Decl(substituteReturnTypeSatisfiesConstraint.ts, 0, 0)) +>T : Symbol(T, Decl(substituteReturnTypeSatisfiesConstraint.ts, 2, 7)) + +type FFG = T extends O ? X> : never; // error! +>FFG : Symbol(FFG, Decl(substituteReturnTypeSatisfiesConstraint.ts, 2, 24)) +>T : Symbol(T, Decl(substituteReturnTypeSatisfiesConstraint.ts, 3, 9)) +>T : Symbol(T, Decl(substituteReturnTypeSatisfiesConstraint.ts, 3, 9)) +>O : Symbol(O, Decl(substituteReturnTypeSatisfiesConstraint.ts, 0, 23)) +>X : Symbol(X, Decl(substituteReturnTypeSatisfiesConstraint.ts, 1, 24)) +>ReturnType : Symbol(ReturnType, Decl(lib.es5.d.ts, --, --)) +>T : Symbol(T, Decl(substituteReturnTypeSatisfiesConstraint.ts, 3, 9)) + diff --git a/tests/baselines/reference/substituteReturnTypeSatisfiesConstraint.types b/tests/baselines/reference/substituteReturnTypeSatisfiesConstraint.types new file mode 100644 index 0000000000000..51f69b9fb22e7 --- /dev/null +++ b/tests/baselines/reference/substituteReturnTypeSatisfiesConstraint.types @@ -0,0 +1,15 @@ +=== tests/cases/compiler/substituteReturnTypeSatisfiesConstraint.ts === +type M = { p: string }; +>M : M +>p : string + +type O = { m: () => M }; +>O : O +>m : () => M + +type X = T; +>X : T + +type FFG = T extends O ? X> : never; // error! +>FFG : FFG + diff --git a/tests/cases/compiler/substituteReturnTypeSatisfiesConstraint.ts b/tests/cases/compiler/substituteReturnTypeSatisfiesConstraint.ts new file mode 100644 index 0000000000000..6d2aff9c5d76c --- /dev/null +++ b/tests/cases/compiler/substituteReturnTypeSatisfiesConstraint.ts @@ -0,0 +1,4 @@ +type M = { p: string }; +type O = { m: () => M }; +type X = T; +type FFG = T extends O ? X> : never; // error! From 9071a923aaa2f7b313452f5177e9bd5b9891e2d1 Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Fri, 2 Aug 2019 14:29:02 -0700 Subject: [PATCH 2/2] Still skip conditional inference when `extends infer Q` so such a pattern still acts as a constraint size breaker --- src/compiler/checker.ts | 14 +- .../reference/ramdaToolsNoInfinite.js | 123 +++++ .../reference/ramdaToolsNoInfinite.symbols | 431 ++++++++++++++++++ .../reference/ramdaToolsNoInfinite.types | 221 +++++++++ tests/cases/compiler/ramdaToolsNoInfinite.ts | 120 +++++ 5 files changed, 905 insertions(+), 4 deletions(-) create mode 100644 tests/baselines/reference/ramdaToolsNoInfinite.js create mode 100644 tests/baselines/reference/ramdaToolsNoInfinite.symbols create mode 100644 tests/baselines/reference/ramdaToolsNoInfinite.types create mode 100644 tests/cases/compiler/ramdaToolsNoInfinite.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 90681c8d8d1cc..fb0f274c250b9 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -10647,10 +10647,16 @@ namespace ts { let combinedMapper: TypeMapper | undefined; if (root.inferTypeParameters) { const context = createInferenceContext(root.inferTypeParameters, /*signature*/ undefined, InferenceFlags.None); - // We don't want inferences from constraints as they may cause us to eagerly resolve the - // conditional type instead of deferring resolution. Also, we always want strict function - // types rules (i.e. proper contravariance) for inferences. - inferTypes(context.inferences, checkType, extendsType, InferencePriority.NoConstraints | InferencePriority.AlwaysStrict); + // We skip inference of the possible `infer` types unles the `extendsType` _is_ an infer type + // if it was, it's trivial to say that extendsType = checkType, however such a pattern is used to + // "reset" the type being build up during constraint calculation and avoid making an apparently "infinite" constraint + // so in those cases we refain from performing inference and retain the uninfered type parameter + if (!checkTypeInstantiable || !some(root.inferTypeParameters, t => t === extendsType)) { + // We don't want inferences from constraints as they may cause us to eagerly resolve the + // conditional type instead of deferring resolution. Also, we always want strict function + // types rules (i.e. proper contravariance) for inferences. + inferTypes(context.inferences, checkType, extendsType, InferencePriority.NoConstraints | InferencePriority.AlwaysStrict); + } combinedMapper = combineTypeMappers(mapper, context.mapper); } // Instantiate the extends type including inferences for 'infer T' type parameters diff --git a/tests/baselines/reference/ramdaToolsNoInfinite.js b/tests/baselines/reference/ramdaToolsNoInfinite.js new file mode 100644 index 0000000000000..2bd0a25de255b --- /dev/null +++ b/tests/baselines/reference/ramdaToolsNoInfinite.js @@ -0,0 +1,123 @@ +//// [ramdaToolsNoInfinite.ts] +// All the following types are explained here: +// https://medium.freecodecamp.org/typescript-curry-ramda-types-f747e99744ab +// https://github.com/pirix-gh/medium/blob/master/types-curry-ramda/src/index.ts +declare namespace Tools { + type Head = + T extends [any, ...any[]] + ? T[0] + : never; + + type Tail = + ((...t: T) => any) extends ((_: any, ...tail: infer TT) => any) + ? TT + : []; + + type HasTail = + T extends ([] | [any]) + ? false + : true; + + type Last = { + 0: Last>; + 1: Head; + }[ + HasTail extends true + ? 0 + : 1 + ]; + + type Length = + T['length']; + + type Prepend = + ((head: E, ...args: T) => any) extends ((...args: infer U) => any) + ? U + : T; + + type Drop = { + 0: Drop, Prepend>; + 1: T; + }[ + Length extends N + ? 1 + : 0 + ]; + + type Cast = X extends Y ? X : Y; + + type Pos = + Length; + + type Next = + Prepend; + + type Prev = + Tail; + + type Iterator = { + 0: Iterator, Next>; + 1: From; + }[ + Pos extends Index + ? 1 + : 0 + ]; + + type Reverse = { + 0: Reverse], R>, Next>; + 1: R; + }[ + Pos extends Length + ? 1 + : 0 + ]; + + type Concat = + Reverse extends infer R ? Cast : never, T2>; + + type Append = + Concat; + + type ValueOfRecord = R extends Record ? T : never; +} + +declare namespace R { + export type Placeholder = { __placeholder: void }; +} + +declare namespace Curry { + type GapOf = + T1[Tools.Pos] extends R.Placeholder + ? Tools.Append], TN> + : TN; + + interface GapsOfWorker { + 0: GapsOf extends infer G ? Tools.Cast : never, Tools.Next>; + 1: Tools.Concat, T2> extends infer D ? Tools.Cast : never>; + } + type GapsOf = GapsOfWorker[ + Tools.Pos extends Tools.Length + ? 1 + : 0 + ]; + + type PartialGaps = { + [K in keyof T]?: T[K] | R.Placeholder + }; + + type CleanedGaps = { + [K in keyof T]: NonNullable + }; + + type Gaps = CleanedGaps>; + + type Curry any)> = + (...args: Tools.Cast>>, any[]>) => + GapsOf> extends [any, ...any[]] + ? Curry<(...args: GapsOf> extends infer G ? Tools.Cast : never) => ReturnType> + : ReturnType; +} + + +//// [ramdaToolsNoInfinite.js] diff --git a/tests/baselines/reference/ramdaToolsNoInfinite.symbols b/tests/baselines/reference/ramdaToolsNoInfinite.symbols new file mode 100644 index 0000000000000..096b6ae9788e1 --- /dev/null +++ b/tests/baselines/reference/ramdaToolsNoInfinite.symbols @@ -0,0 +1,431 @@ +=== tests/cases/compiler/ramdaToolsNoInfinite.ts === +// All the following types are explained here: +// https://medium.freecodecamp.org/typescript-curry-ramda-types-f747e99744ab +// https://github.com/pirix-gh/medium/blob/master/types-curry-ramda/src/index.ts +declare namespace Tools { +>Tools : Symbol(Tools, Decl(ramdaToolsNoInfinite.ts, 0, 0)) + + type Head = +>Head : Symbol(Head, Decl(ramdaToolsNoInfinite.ts, 3, 25)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 4, 14)) + + T extends [any, ...any[]] +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 4, 14)) + + ? T[0] +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 4, 14)) + + : never; + + type Tail = +>Tail : Symbol(Tail, Decl(ramdaToolsNoInfinite.ts, 7, 16)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 9, 14)) + + ((...t: T) => any) extends ((_: any, ...tail: infer TT) => any) +>t : Symbol(t, Decl(ramdaToolsNoInfinite.ts, 10, 10)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 9, 14)) +>_ : Symbol(_, Decl(ramdaToolsNoInfinite.ts, 10, 37)) +>tail : Symbol(tail, Decl(ramdaToolsNoInfinite.ts, 10, 44)) +>TT : Symbol(TT, Decl(ramdaToolsNoInfinite.ts, 10, 59)) + + ? TT +>TT : Symbol(TT, Decl(ramdaToolsNoInfinite.ts, 10, 59)) + + : []; + + type HasTail = +>HasTail : Symbol(HasTail, Decl(ramdaToolsNoInfinite.ts, 12, 13)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 14, 17)) + + T extends ([] | [any]) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 14, 17)) + + ? false + : true; + + type Last = { +>Last : Symbol(Last, Decl(ramdaToolsNoInfinite.ts, 17, 15)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 19, 14)) + + 0: Last>; +>0 : Symbol(0, Decl(ramdaToolsNoInfinite.ts, 19, 34)) +>Last : Symbol(Last, Decl(ramdaToolsNoInfinite.ts, 17, 15)) +>Tail : Symbol(Tail, Decl(ramdaToolsNoInfinite.ts, 7, 16)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 19, 14)) + + 1: Head; +>1 : Symbol(1, Decl(ramdaToolsNoInfinite.ts, 20, 25)) +>Head : Symbol(Head, Decl(ramdaToolsNoInfinite.ts, 3, 25)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 19, 14)) + + }[ + HasTail extends true +>HasTail : Symbol(HasTail, Decl(ramdaToolsNoInfinite.ts, 12, 13)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 19, 14)) + + ? 0 + : 1 + ]; + + type Length = +>Length : Symbol(Length, Decl(ramdaToolsNoInfinite.ts, 26, 6)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 28, 16)) + + T['length']; +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 28, 16)) + + type Prepend = +>Prepend : Symbol(Prepend, Decl(ramdaToolsNoInfinite.ts, 29, 20)) +>E : Symbol(E, Decl(ramdaToolsNoInfinite.ts, 31, 17)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 31, 19)) + + ((head: E, ...args: T) => any) extends ((...args: infer U) => any) +>head : Symbol(head, Decl(ramdaToolsNoInfinite.ts, 32, 10)) +>E : Symbol(E, Decl(ramdaToolsNoInfinite.ts, 31, 17)) +>args : Symbol(args, Decl(ramdaToolsNoInfinite.ts, 32, 18)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 31, 19)) +>args : Symbol(args, Decl(ramdaToolsNoInfinite.ts, 32, 49)) +>U : Symbol(U, Decl(ramdaToolsNoInfinite.ts, 32, 63)) + + ? U +>U : Symbol(U, Decl(ramdaToolsNoInfinite.ts, 32, 63)) + + : T; +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 31, 19)) + + type Drop = { +>Drop : Symbol(Drop, Decl(ramdaToolsNoInfinite.ts, 34, 12)) +>N : Symbol(N, Decl(ramdaToolsNoInfinite.ts, 36, 14)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 36, 31)) +>I : Symbol(I, Decl(ramdaToolsNoInfinite.ts, 36, 48)) + + 0: Drop, Prepend>; +>0 : Symbol(0, Decl(ramdaToolsNoInfinite.ts, 36, 74)) +>Drop : Symbol(Drop, Decl(ramdaToolsNoInfinite.ts, 34, 12)) +>N : Symbol(N, Decl(ramdaToolsNoInfinite.ts, 36, 14)) +>Tail : Symbol(Tail, Decl(ramdaToolsNoInfinite.ts, 7, 16)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 36, 31)) +>Prepend : Symbol(Prepend, Decl(ramdaToolsNoInfinite.ts, 29, 20)) +>I : Symbol(I, Decl(ramdaToolsNoInfinite.ts, 36, 48)) + + 1: T; +>1 : Symbol(1, Decl(ramdaToolsNoInfinite.ts, 37, 45)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 36, 31)) + + }[ + Length extends N +>Length : Symbol(Length, Decl(ramdaToolsNoInfinite.ts, 26, 6)) +>I : Symbol(I, Decl(ramdaToolsNoInfinite.ts, 36, 48)) +>N : Symbol(N, Decl(ramdaToolsNoInfinite.ts, 36, 14)) + + ? 1 + : 0 + ]; + + type Cast = X extends Y ? X : Y; +>Cast : Symbol(Cast, Decl(ramdaToolsNoInfinite.ts, 43, 6)) +>X : Symbol(X, Decl(ramdaToolsNoInfinite.ts, 45, 14)) +>Y : Symbol(Y, Decl(ramdaToolsNoInfinite.ts, 45, 16)) +>X : Symbol(X, Decl(ramdaToolsNoInfinite.ts, 45, 14)) +>Y : Symbol(Y, Decl(ramdaToolsNoInfinite.ts, 45, 16)) +>X : Symbol(X, Decl(ramdaToolsNoInfinite.ts, 45, 14)) +>Y : Symbol(Y, Decl(ramdaToolsNoInfinite.ts, 45, 16)) + + type Pos = +>Pos : Symbol(Pos, Decl(ramdaToolsNoInfinite.ts, 45, 42)) +>I : Symbol(I, Decl(ramdaToolsNoInfinite.ts, 47, 13)) + + Length; +>Length : Symbol(Length, Decl(ramdaToolsNoInfinite.ts, 26, 6)) +>I : Symbol(I, Decl(ramdaToolsNoInfinite.ts, 47, 13)) + + type Next = +>Next : Symbol(Next, Decl(ramdaToolsNoInfinite.ts, 48, 18)) +>I : Symbol(I, Decl(ramdaToolsNoInfinite.ts, 50, 14)) + + Prepend; +>Prepend : Symbol(Prepend, Decl(ramdaToolsNoInfinite.ts, 29, 20)) +>I : Symbol(I, Decl(ramdaToolsNoInfinite.ts, 50, 14)) + + type Prev = +>Prev : Symbol(Prev, Decl(ramdaToolsNoInfinite.ts, 51, 24)) +>I : Symbol(I, Decl(ramdaToolsNoInfinite.ts, 53, 14)) + + Tail; +>Tail : Symbol(Tail, Decl(ramdaToolsNoInfinite.ts, 7, 16)) +>I : Symbol(I, Decl(ramdaToolsNoInfinite.ts, 53, 14)) + + type Iterator = { +>Iterator : Symbol(Iterator, Decl(ramdaToolsNoInfinite.ts, 54, 16)) +>Index : Symbol(Index, Decl(ramdaToolsNoInfinite.ts, 56, 18)) +>From : Symbol(From, Decl(ramdaToolsNoInfinite.ts, 56, 43)) +>I : Symbol(I, Decl(ramdaToolsNoInfinite.ts, 56, 68)) + + 0: Iterator, Next>; +>0 : Symbol(0, Decl(ramdaToolsNoInfinite.ts, 56, 94)) +>Iterator : Symbol(Iterator, Decl(ramdaToolsNoInfinite.ts, 54, 16)) +>Index : Symbol(Index, Decl(ramdaToolsNoInfinite.ts, 56, 18)) +>Next : Symbol(Next, Decl(ramdaToolsNoInfinite.ts, 48, 18)) +>From : Symbol(From, Decl(ramdaToolsNoInfinite.ts, 56, 43)) +>Next : Symbol(Next, Decl(ramdaToolsNoInfinite.ts, 48, 18)) +>I : Symbol(I, Decl(ramdaToolsNoInfinite.ts, 56, 68)) + + 1: From; +>1 : Symbol(1, Decl(ramdaToolsNoInfinite.ts, 57, 48)) +>From : Symbol(From, Decl(ramdaToolsNoInfinite.ts, 56, 43)) + + }[ + Pos extends Index +>Pos : Symbol(Pos, Decl(ramdaToolsNoInfinite.ts, 45, 42)) +>I : Symbol(I, Decl(ramdaToolsNoInfinite.ts, 56, 68)) +>Index : Symbol(Index, Decl(ramdaToolsNoInfinite.ts, 56, 18)) + + ? 1 + : 0 + ]; + + type Reverse = { +>Reverse : Symbol(Reverse, Decl(ramdaToolsNoInfinite.ts, 63, 6)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 65, 17)) +>R : Symbol(R, Decl(ramdaToolsNoInfinite.ts, 65, 33)) +>I : Symbol(I, Decl(ramdaToolsNoInfinite.ts, 65, 55)) + + 0: Reverse], R>, Next>; +>0 : Symbol(0, Decl(ramdaToolsNoInfinite.ts, 65, 81)) +>Reverse : Symbol(Reverse, Decl(ramdaToolsNoInfinite.ts, 63, 6)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 65, 17)) +>Prepend : Symbol(Prepend, Decl(ramdaToolsNoInfinite.ts, 29, 20)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 65, 17)) +>Pos : Symbol(Pos, Decl(ramdaToolsNoInfinite.ts, 45, 42)) +>I : Symbol(I, Decl(ramdaToolsNoInfinite.ts, 65, 55)) +>R : Symbol(R, Decl(ramdaToolsNoInfinite.ts, 65, 33)) +>Next : Symbol(Next, Decl(ramdaToolsNoInfinite.ts, 48, 18)) +>I : Symbol(I, Decl(ramdaToolsNoInfinite.ts, 65, 55)) + + 1: R; +>1 : Symbol(1, Decl(ramdaToolsNoInfinite.ts, 66, 54)) +>R : Symbol(R, Decl(ramdaToolsNoInfinite.ts, 65, 33)) + + }[ + Pos extends Length +>Pos : Symbol(Pos, Decl(ramdaToolsNoInfinite.ts, 45, 42)) +>I : Symbol(I, Decl(ramdaToolsNoInfinite.ts, 65, 55)) +>Length : Symbol(Length, Decl(ramdaToolsNoInfinite.ts, 26, 6)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 65, 17)) + + ? 1 + : 0 + ]; + + type Concat = +>Concat : Symbol(Concat, Decl(ramdaToolsNoInfinite.ts, 72, 6)) +>T1 : Symbol(T1, Decl(ramdaToolsNoInfinite.ts, 74, 16)) +>T2 : Symbol(T2, Decl(ramdaToolsNoInfinite.ts, 74, 33)) + + Reverse extends infer R ? Cast : never, T2>; +>Reverse : Symbol(Reverse, Decl(ramdaToolsNoInfinite.ts, 63, 6)) +>Reverse : Symbol(Reverse, Decl(ramdaToolsNoInfinite.ts, 63, 6)) +>T1 : Symbol(T1, Decl(ramdaToolsNoInfinite.ts, 74, 16)) +>R : Symbol(R, Decl(ramdaToolsNoInfinite.ts, 75, 41)) +>Cast : Symbol(Cast, Decl(ramdaToolsNoInfinite.ts, 43, 6)) +>R : Symbol(R, Decl(ramdaToolsNoInfinite.ts, 75, 41)) +>T2 : Symbol(T2, Decl(ramdaToolsNoInfinite.ts, 74, 33)) + + type Append = +>Append : Symbol(Append, Decl(ramdaToolsNoInfinite.ts, 75, 74)) +>E : Symbol(E, Decl(ramdaToolsNoInfinite.ts, 77, 16)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 77, 18)) + + Concat; +>Concat : Symbol(Concat, Decl(ramdaToolsNoInfinite.ts, 72, 6)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 77, 18)) +>E : Symbol(E, Decl(ramdaToolsNoInfinite.ts, 77, 16)) + + type ValueOfRecord = R extends Record ? T : never; +>ValueOfRecord : Symbol(ValueOfRecord, Decl(ramdaToolsNoInfinite.ts, 78, 23)) +>R : Symbol(R, Decl(ramdaToolsNoInfinite.ts, 80, 23)) +>R : Symbol(R, Decl(ramdaToolsNoInfinite.ts, 80, 23)) +>Record : Symbol(Record, Decl(lib.es5.d.ts, --, --)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 80, 55)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 80, 55)) +} + +declare namespace R { +>R : Symbol(R, Decl(ramdaToolsNoInfinite.ts, 81, 1)) + + export type Placeholder = { __placeholder: void }; +>Placeholder : Symbol(Placeholder, Decl(ramdaToolsNoInfinite.ts, 83, 21)) +>__placeholder : Symbol(__placeholder, Decl(ramdaToolsNoInfinite.ts, 84, 31)) +} + +declare namespace Curry { +>Curry : Symbol(Curry, Decl(ramdaToolsNoInfinite.ts, 85, 1)) + + type GapOf = +>GapOf : Symbol(GapOf, Decl(ramdaToolsNoInfinite.ts, 87, 25)) +>T1 : Symbol(T1, Decl(ramdaToolsNoInfinite.ts, 88, 15)) +>T2 : Symbol(T2, Decl(ramdaToolsNoInfinite.ts, 88, 32)) +>TN : Symbol(TN, Decl(ramdaToolsNoInfinite.ts, 88, 50)) +>I : Symbol(I, Decl(ramdaToolsNoInfinite.ts, 88, 68)) + + T1[Tools.Pos] extends R.Placeholder +>T1 : Symbol(T1, Decl(ramdaToolsNoInfinite.ts, 88, 15)) +>Tools : Symbol(Tools, Decl(ramdaToolsNoInfinite.ts, 0, 0)) +>Pos : Symbol(Tools.Pos, Decl(ramdaToolsNoInfinite.ts, 45, 42)) +>I : Symbol(I, Decl(ramdaToolsNoInfinite.ts, 88, 68)) +>R : Symbol(R, Decl(ramdaToolsNoInfinite.ts, 81, 1)) +>Placeholder : Symbol(R.Placeholder, Decl(ramdaToolsNoInfinite.ts, 83, 21)) + + ? Tools.Append], TN> +>Tools : Symbol(Tools, Decl(ramdaToolsNoInfinite.ts, 0, 0)) +>Append : Symbol(Tools.Append, Decl(ramdaToolsNoInfinite.ts, 75, 74)) +>T2 : Symbol(T2, Decl(ramdaToolsNoInfinite.ts, 88, 32)) +>Tools : Symbol(Tools, Decl(ramdaToolsNoInfinite.ts, 0, 0)) +>Pos : Symbol(Tools.Pos, Decl(ramdaToolsNoInfinite.ts, 45, 42)) +>I : Symbol(I, Decl(ramdaToolsNoInfinite.ts, 88, 68)) +>TN : Symbol(TN, Decl(ramdaToolsNoInfinite.ts, 88, 50)) + + : TN; +>TN : Symbol(TN, Decl(ramdaToolsNoInfinite.ts, 88, 50)) + + interface GapsOfWorker { +>GapsOfWorker : Symbol(GapsOfWorker, Decl(ramdaToolsNoInfinite.ts, 91, 13)) +>T1 : Symbol(T1, Decl(ramdaToolsNoInfinite.ts, 93, 27)) +>T2 : Symbol(T2, Decl(ramdaToolsNoInfinite.ts, 93, 44)) +>TN : Symbol(TN, Decl(ramdaToolsNoInfinite.ts, 93, 62)) +>I : Symbol(I, Decl(ramdaToolsNoInfinite.ts, 93, 85)) + + 0: GapsOf extends infer G ? Tools.Cast : never, Tools.Next>; +>0 : Symbol(GapsOfWorker[0], Decl(ramdaToolsNoInfinite.ts, 93, 109)) +>GapsOf : Symbol(GapsOf, Decl(ramdaToolsNoInfinite.ts, 96, 5)) +>T1 : Symbol(T1, Decl(ramdaToolsNoInfinite.ts, 93, 27)) +>T2 : Symbol(T2, Decl(ramdaToolsNoInfinite.ts, 93, 44)) +>GapOf : Symbol(GapOf, Decl(ramdaToolsNoInfinite.ts, 87, 25)) +>T1 : Symbol(T1, Decl(ramdaToolsNoInfinite.ts, 93, 27)) +>T2 : Symbol(T2, Decl(ramdaToolsNoInfinite.ts, 93, 44)) +>TN : Symbol(TN, Decl(ramdaToolsNoInfinite.ts, 93, 62)) +>I : Symbol(I, Decl(ramdaToolsNoInfinite.ts, 93, 85)) +>G : Symbol(G, Decl(ramdaToolsNoInfinite.ts, 94, 60)) +>Tools : Symbol(Tools, Decl(ramdaToolsNoInfinite.ts, 0, 0)) +>Cast : Symbol(Tools.Cast, Decl(ramdaToolsNoInfinite.ts, 43, 6)) +>G : Symbol(G, Decl(ramdaToolsNoInfinite.ts, 94, 60)) +>Tools : Symbol(Tools, Decl(ramdaToolsNoInfinite.ts, 0, 0)) +>Next : Symbol(Tools.Next, Decl(ramdaToolsNoInfinite.ts, 48, 18)) +>I : Symbol(I, Decl(ramdaToolsNoInfinite.ts, 93, 85)) + + 1: Tools.Concat, T2> extends infer D ? Tools.Cast : never>; +>1 : Symbol(GapsOfWorker[1], Decl(ramdaToolsNoInfinite.ts, 94, 110)) +>Tools : Symbol(Tools, Decl(ramdaToolsNoInfinite.ts, 0, 0)) +>Concat : Symbol(Tools.Concat, Decl(ramdaToolsNoInfinite.ts, 72, 6)) +>TN : Symbol(TN, Decl(ramdaToolsNoInfinite.ts, 93, 62)) +>Tools : Symbol(Tools, Decl(ramdaToolsNoInfinite.ts, 0, 0)) +>Drop : Symbol(Tools.Drop, Decl(ramdaToolsNoInfinite.ts, 34, 12)) +>Tools : Symbol(Tools, Decl(ramdaToolsNoInfinite.ts, 0, 0)) +>Pos : Symbol(Tools.Pos, Decl(ramdaToolsNoInfinite.ts, 45, 42)) +>I : Symbol(I, Decl(ramdaToolsNoInfinite.ts, 93, 85)) +>T2 : Symbol(T2, Decl(ramdaToolsNoInfinite.ts, 93, 44)) +>D : Symbol(D, Decl(ramdaToolsNoInfinite.ts, 95, 70)) +>Tools : Symbol(Tools, Decl(ramdaToolsNoInfinite.ts, 0, 0)) +>Cast : Symbol(Tools.Cast, Decl(ramdaToolsNoInfinite.ts, 43, 6)) +>D : Symbol(D, Decl(ramdaToolsNoInfinite.ts, 95, 70)) + } + type GapsOf = GapsOfWorker[ +>GapsOf : Symbol(GapsOf, Decl(ramdaToolsNoInfinite.ts, 96, 5)) +>T1 : Symbol(T1, Decl(ramdaToolsNoInfinite.ts, 97, 16)) +>T2 : Symbol(T2, Decl(ramdaToolsNoInfinite.ts, 97, 33)) +>TN : Symbol(TN, Decl(ramdaToolsNoInfinite.ts, 97, 51)) +>I : Symbol(I, Decl(ramdaToolsNoInfinite.ts, 97, 74)) +>GapsOfWorker : Symbol(GapsOfWorker, Decl(ramdaToolsNoInfinite.ts, 91, 13)) +>T1 : Symbol(T1, Decl(ramdaToolsNoInfinite.ts, 97, 16)) +>T2 : Symbol(T2, Decl(ramdaToolsNoInfinite.ts, 97, 33)) +>TN : Symbol(TN, Decl(ramdaToolsNoInfinite.ts, 97, 51)) +>I : Symbol(I, Decl(ramdaToolsNoInfinite.ts, 97, 74)) + + Tools.Pos extends Tools.Length +>Tools : Symbol(Tools, Decl(ramdaToolsNoInfinite.ts, 0, 0)) +>Pos : Symbol(Tools.Pos, Decl(ramdaToolsNoInfinite.ts, 45, 42)) +>I : Symbol(I, Decl(ramdaToolsNoInfinite.ts, 97, 74)) +>Tools : Symbol(Tools, Decl(ramdaToolsNoInfinite.ts, 0, 0)) +>Length : Symbol(Tools.Length, Decl(ramdaToolsNoInfinite.ts, 26, 6)) +>T1 : Symbol(T1, Decl(ramdaToolsNoInfinite.ts, 97, 16)) + + ? 1 + : 0 + ]; + + type PartialGaps = { +>PartialGaps : Symbol(PartialGaps, Decl(ramdaToolsNoInfinite.ts, 101, 6)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 103, 21)) + + [K in keyof T]?: T[K] | R.Placeholder +>K : Symbol(K, Decl(ramdaToolsNoInfinite.ts, 104, 9)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 103, 21)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 103, 21)) +>K : Symbol(K, Decl(ramdaToolsNoInfinite.ts, 104, 9)) +>R : Symbol(R, Decl(ramdaToolsNoInfinite.ts, 81, 1)) +>Placeholder : Symbol(R.Placeholder, Decl(ramdaToolsNoInfinite.ts, 83, 21)) + + }; + + type CleanedGaps = { +>CleanedGaps : Symbol(CleanedGaps, Decl(ramdaToolsNoInfinite.ts, 105, 6)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 107, 21)) + + [K in keyof T]: NonNullable +>K : Symbol(K, Decl(ramdaToolsNoInfinite.ts, 108, 9)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 107, 21)) +>NonNullable : Symbol(NonNullable, Decl(lib.es5.d.ts, --, --)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 107, 21)) +>K : Symbol(K, Decl(ramdaToolsNoInfinite.ts, 108, 9)) + + }; + + type Gaps = CleanedGaps>; +>Gaps : Symbol(Gaps, Decl(ramdaToolsNoInfinite.ts, 109, 6)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 111, 14)) +>CleanedGaps : Symbol(CleanedGaps, Decl(ramdaToolsNoInfinite.ts, 105, 6)) +>PartialGaps : Symbol(PartialGaps, Decl(ramdaToolsNoInfinite.ts, 101, 6)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 111, 14)) + + type Curry any)> = +>Curry : Symbol(Curry, Decl(ramdaToolsNoInfinite.ts, 111, 61)) +>F : Symbol(F, Decl(ramdaToolsNoInfinite.ts, 113, 15)) +>args : Symbol(args, Decl(ramdaToolsNoInfinite.ts, 113, 27)) + + (...args: Tools.Cast>>, any[]>) => +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 114, 9)) +>args : Symbol(args, Decl(ramdaToolsNoInfinite.ts, 114, 26)) +>Tools : Symbol(Tools, Decl(ramdaToolsNoInfinite.ts, 0, 0)) +>Cast : Symbol(Tools.Cast, Decl(ramdaToolsNoInfinite.ts, 43, 6)) +>Tools : Symbol(Tools, Decl(ramdaToolsNoInfinite.ts, 0, 0)) +>Cast : Symbol(Tools.Cast, Decl(ramdaToolsNoInfinite.ts, 43, 6)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 114, 9)) +>Gaps : Symbol(Gaps, Decl(ramdaToolsNoInfinite.ts, 109, 6)) +>Parameters : Symbol(Parameters, Decl(lib.es5.d.ts, --, --)) +>F : Symbol(F, Decl(ramdaToolsNoInfinite.ts, 113, 15)) + + GapsOf> extends [any, ...any[]] +>GapsOf : Symbol(GapsOf, Decl(ramdaToolsNoInfinite.ts, 96, 5)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 114, 9)) +>Parameters : Symbol(Parameters, Decl(lib.es5.d.ts, --, --)) +>F : Symbol(F, Decl(ramdaToolsNoInfinite.ts, 113, 15)) + + ? Curry<(...args: GapsOf> extends infer G ? Tools.Cast : never) => ReturnType> +>Curry : Symbol(Curry, Decl(ramdaToolsNoInfinite.ts, 111, 61)) +>args : Symbol(args, Decl(ramdaToolsNoInfinite.ts, 116, 21)) +>GapsOf : Symbol(GapsOf, Decl(ramdaToolsNoInfinite.ts, 96, 5)) +>T : Symbol(T, Decl(ramdaToolsNoInfinite.ts, 114, 9)) +>Parameters : Symbol(Parameters, Decl(lib.es5.d.ts, --, --)) +>F : Symbol(F, Decl(ramdaToolsNoInfinite.ts, 113, 15)) +>G : Symbol(G, Decl(ramdaToolsNoInfinite.ts, 116, 68)) +>Tools : Symbol(Tools, Decl(ramdaToolsNoInfinite.ts, 0, 0)) +>Cast : Symbol(Tools.Cast, Decl(ramdaToolsNoInfinite.ts, 43, 6)) +>G : Symbol(G, Decl(ramdaToolsNoInfinite.ts, 116, 68)) +>ReturnType : Symbol(ReturnType, Decl(lib.es5.d.ts, --, --)) +>F : Symbol(F, Decl(ramdaToolsNoInfinite.ts, 113, 15)) + + : ReturnType; +>ReturnType : Symbol(ReturnType, Decl(lib.es5.d.ts, --, --)) +>F : Symbol(F, Decl(ramdaToolsNoInfinite.ts, 113, 15)) +} + diff --git a/tests/baselines/reference/ramdaToolsNoInfinite.types b/tests/baselines/reference/ramdaToolsNoInfinite.types new file mode 100644 index 0000000000000..097cf8cd81736 --- /dev/null +++ b/tests/baselines/reference/ramdaToolsNoInfinite.types @@ -0,0 +1,221 @@ +=== tests/cases/compiler/ramdaToolsNoInfinite.ts === +// All the following types are explained here: +// https://medium.freecodecamp.org/typescript-curry-ramda-types-f747e99744ab +// https://github.com/pirix-gh/medium/blob/master/types-curry-ramda/src/index.ts +declare namespace Tools { + type Head = +>Head : Head + + T extends [any, ...any[]] + ? T[0] + : never; + + type Tail = +>Tail : Tail + + ((...t: T) => any) extends ((_: any, ...tail: infer TT) => any) +>t : T +>_ : any +>tail : TT + + ? TT + : []; + + type HasTail = +>HasTail : HasTail + + T extends ([] | [any]) + ? false +>false : false + + : true; +>true : true + + type Last = { +>Last : { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[HasTail>>>>>>>>>>> extends true ? 0 : 1]; 1: Head>>>>>>>>>>; }[HasTail>>>>>>>>>> extends true ? 0 : 1]; 1: Head>>>>>>>>>; }[HasTail>>>>>>>>> extends true ? 0 : 1]; 1: Head>>>>>>>>; }[HasTail>>>>>>>> extends true ? 0 : 1]; 1: Head>>>>>>>; }[HasTail>>>>>>> extends true ? 0 : 1]; 1: Head>>>>>>; }[HasTail>>>>>> extends true ? 0 : 1]; 1: Head>>>>>; }[HasTail>>>>> extends true ? 0 : 1]; 1: Head>>>>; }[HasTail>>>> extends true ? 0 : 1]; 1: Head>>>; }[HasTail>>> extends true ? 0 : 1]; 1: Head>>; }[HasTail>> extends true ? 0 : 1]; 1: Head>; }[HasTail> extends true ? 0 : 1]; 1: Head; }[HasTail extends true ? 0 : 1] + + 0: Last>; +>0 : { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[HasTail>>>>>>>>>>>> extends true ? 0 : 1]; 1: Head>>>>>>>>>>>; }[HasTail>>>>>>>>>>> extends true ? 0 : 1]; 1: Head>>>>>>>>>>; }[HasTail>>>>>>>>>> extends true ? 0 : 1]; 1: Head>>>>>>>>>; }[HasTail>>>>>>>>> extends true ? 0 : 1]; 1: Head>>>>>>>>; }[HasTail>>>>>>>> extends true ? 0 : 1]; 1: Head>>>>>>>; }[HasTail>>>>>>> extends true ? 0 : 1]; 1: Head>>>>>>; }[HasTail>>>>>> extends true ? 0 : 1]; 1: Head>>>>>; }[HasTail>>>>> extends true ? 0 : 1]; 1: Head>>>>; }[HasTail>>>> extends true ? 0 : 1]; 1: Head>>>; }[HasTail>>> extends true ? 0 : 1]; 1: Head>>; }[HasTail>> extends true ? 0 : 1]; 1: Head>; }[HasTail> extends true ? 0 : 1] + + 1: Head; +>1 : Head + + }[ + HasTail extends true +>true : true + + ? 0 + : 1 + ]; + + type Length = +>Length : T["length"] + + T['length']; + + type Prepend = +>Prepend : Prepend + + ((head: E, ...args: T) => any) extends ((...args: infer U) => any) +>head : E +>args : T +>args : U + + ? U + : T; + + type Drop = { +>Drop : { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[Prepend>>>>>>>>>>["length"] extends N ? 1 : 0]; 1: Tail>>>>>>>>>; }[Prepend>>>>>>>>>["length"] extends N ? 1 : 0]; 1: Tail>>>>>>>>; }[Prepend>>>>>>>>["length"] extends N ? 1 : 0]; 1: Tail>>>>>>>; }[Prepend>>>>>>>["length"] extends N ? 1 : 0]; 1: Tail>>>>>>; }[Prepend>>>>>>["length"] extends N ? 1 : 0]; 1: Tail>>>>>; }[Prepend>>>>>["length"] extends N ? 1 : 0]; 1: Tail>>>>; }[Prepend>>>>["length"] extends N ? 1 : 0]; 1: Tail>>>; }[Prepend>>>["length"] extends N ? 1 : 0]; 1: Tail>>; }[Prepend>>["length"] extends N ? 1 : 0]; 1: Tail>; }[Prepend>["length"] extends N ? 1 : 0]; 1: Tail; }[Prepend["length"] extends N ? 1 : 0]; 1: T; }[I["length"] extends N ? 1 : 0] + + 0: Drop, Prepend>; +>0 : { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[Prepend>>>>>>>>>>>["length"] extends N ? 1 : 0]; 1: Tail>>>>>>>>>>; }[Prepend>>>>>>>>>>["length"] extends N ? 1 : 0]; 1: Tail>>>>>>>>>; }[Prepend>>>>>>>>>["length"] extends N ? 1 : 0]; 1: Tail>>>>>>>>; }[Prepend>>>>>>>>["length"] extends N ? 1 : 0]; 1: Tail>>>>>>>; }[Prepend>>>>>>>["length"] extends N ? 1 : 0]; 1: Tail>>>>>>; }[Prepend>>>>>>["length"] extends N ? 1 : 0]; 1: Tail>>>>>; }[Prepend>>>>>["length"] extends N ? 1 : 0]; 1: Tail>>>>; }[Prepend>>>>["length"] extends N ? 1 : 0]; 1: Tail>>>; }[Prepend>>>["length"] extends N ? 1 : 0]; 1: Tail>>; }[Prepend>>["length"] extends N ? 1 : 0]; 1: Tail>; }[Prepend>["length"] extends N ? 1 : 0]; 1: Tail; }[Prepend["length"] extends N ? 1 : 0] + + 1: T; +>1 : T + + }[ + Length extends N + ? 1 + : 0 + ]; + + type Cast = X extends Y ? X : Y; +>Cast : Cast + + type Pos = +>Pos : I["length"] + + Length; + + type Next = +>Next : Prepend + + Prepend; + + type Prev = +>Prev : Tail + + Tail; + + type Iterator = { +>Iterator : { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[Prepend>>>>>>>>>>["length"] extends Index ? 1 : 0]; 1: Prepend>>>>>>>>>; }[Prepend>>>>>>>>>["length"] extends Index ? 1 : 0]; 1: Prepend>>>>>>>>; }[Prepend>>>>>>>>["length"] extends Index ? 1 : 0]; 1: Prepend>>>>>>>; }[Prepend>>>>>>>["length"] extends Index ? 1 : 0]; 1: Prepend>>>>>>; }[Prepend>>>>>>["length"] extends Index ? 1 : 0]; 1: Prepend>>>>>; }[Prepend>>>>>["length"] extends Index ? 1 : 0]; 1: Prepend>>>>; }[Prepend>>>>["length"] extends Index ? 1 : 0]; 1: Prepend>>>; }[Prepend>>>["length"] extends Index ? 1 : 0]; 1: Prepend>>; }[Prepend>>["length"] extends Index ? 1 : 0]; 1: Prepend>; }[Prepend>["length"] extends Index ? 1 : 0]; 1: Prepend; }[Prepend["length"] extends Index ? 1 : 0]; 1: From; }[I["length"] extends Index ? 1 : 0] + + 0: Iterator, Next>; +>0 : { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[Prepend>>>>>>>>>>>["length"] extends Index ? 1 : 0]; 1: Prepend>>>>>>>>>>; }[Prepend>>>>>>>>>>["length"] extends Index ? 1 : 0]; 1: Prepend>>>>>>>>>; }[Prepend>>>>>>>>>["length"] extends Index ? 1 : 0]; 1: Prepend>>>>>>>>; }[Prepend>>>>>>>>["length"] extends Index ? 1 : 0]; 1: Prepend>>>>>>>; }[Prepend>>>>>>>["length"] extends Index ? 1 : 0]; 1: Prepend>>>>>>; }[Prepend>>>>>>["length"] extends Index ? 1 : 0]; 1: Prepend>>>>>; }[Prepend>>>>>["length"] extends Index ? 1 : 0]; 1: Prepend>>>>; }[Prepend>>>>["length"] extends Index ? 1 : 0]; 1: Prepend>>>; }[Prepend>>>["length"] extends Index ? 1 : 0]; 1: Prepend>>; }[Prepend>>["length"] extends Index ? 1 : 0]; 1: Prepend>; }[Prepend>["length"] extends Index ? 1 : 0]; 1: Prepend; }[Prepend["length"] extends Index ? 1 : 0] + + 1: From; +>1 : From + + }[ + Pos extends Index + ? 1 + : 0 + ]; + + type Reverse = { +>Reverse : { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[Prepend>>>>>>>>>>["length"] extends T["length"] ? 1 : 0]; 1: Prepend>>>>>>>>["length"]], Prepend>>>>>>>["length"]], Prepend>>>>>>["length"]], Prepend>>>>>["length"]], Prepend>>>>["length"]], Prepend>>>["length"]], Prepend>>["length"]], Prepend>["length"]], Prepend["length"]], Prepend>>>>>>>>>; }[Prepend>>>>>>>>>["length"] extends T["length"] ? 1 : 0]; 1: Prepend>>>>>>>["length"]], Prepend>>>>>>["length"]], Prepend>>>>>["length"]], Prepend>>>>["length"]], Prepend>>>["length"]], Prepend>>["length"]], Prepend>["length"]], Prepend["length"]], Prepend>>>>>>>>; }[Prepend>>>>>>>>["length"] extends T["length"] ? 1 : 0]; 1: Prepend>>>>>>["length"]], Prepend>>>>>["length"]], Prepend>>>>["length"]], Prepend>>>["length"]], Prepend>>["length"]], Prepend>["length"]], Prepend["length"]], Prepend>>>>>>>; }[Prepend>>>>>>>["length"] extends T["length"] ? 1 : 0]; 1: Prepend>>>>>["length"]], Prepend>>>>["length"]], Prepend>>>["length"]], Prepend>>["length"]], Prepend>["length"]], Prepend["length"]], Prepend>>>>>>; }[Prepend>>>>>>["length"] extends T["length"] ? 1 : 0]; 1: Prepend>>>>["length"]], Prepend>>>["length"]], Prepend>>["length"]], Prepend>["length"]], Prepend["length"]], Prepend>>>>>; }[Prepend>>>>>["length"] extends T["length"] ? 1 : 0]; 1: Prepend>>>["length"]], Prepend>>["length"]], Prepend>["length"]], Prepend["length"]], Prepend>>>>; }[Prepend>>>>["length"] extends T["length"] ? 1 : 0]; 1: Prepend>>["length"]], Prepend>["length"]], Prepend["length"]], Prepend>>>; }[Prepend>>>["length"] extends T["length"] ? 1 : 0]; 1: Prepend>["length"]], Prepend["length"]], Prepend>>; }[Prepend>>["length"] extends T["length"] ? 1 : 0]; 1: Prepend["length"]], Prepend>; }[Prepend>["length"] extends T["length"] ? 1 : 0]; 1: Prepend; }[Prepend["length"] extends T["length"] ? 1 : 0]; 1: R; }[I["length"] extends T["length"] ? 1 : 0] + + 0: Reverse], R>, Next>; +>0 : { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[Prepend>>>>>>>>>>>["length"] extends T["length"] ? 1 : 0]; 1: Prepend>>>>>>>>>["length"]], Prepend>>>>>>>>["length"]], Prepend>>>>>>>["length"]], Prepend>>>>>>["length"]], Prepend>>>>>["length"]], Prepend>>>>["length"]], Prepend>>>["length"]], Prepend>>["length"]], Prepend>["length"]], Prepend["length"]], Prepend>>>>>>>>>>; }[Prepend>>>>>>>>>>["length"] extends T["length"] ? 1 : 0]; 1: Prepend>>>>>>>>["length"]], Prepend>>>>>>>["length"]], Prepend>>>>>>["length"]], Prepend>>>>>["length"]], Prepend>>>>["length"]], Prepend>>>["length"]], Prepend>>["length"]], Prepend>["length"]], Prepend["length"]], Prepend>>>>>>>>>; }[Prepend>>>>>>>>>["length"] extends T["length"] ? 1 : 0]; 1: Prepend>>>>>>>["length"]], Prepend>>>>>>["length"]], Prepend>>>>>["length"]], Prepend>>>>["length"]], Prepend>>>["length"]], Prepend>>["length"]], Prepend>["length"]], Prepend["length"]], Prepend>>>>>>>>; }[Prepend>>>>>>>>["length"] extends T["length"] ? 1 : 0]; 1: Prepend>>>>>>["length"]], Prepend>>>>>["length"]], Prepend>>>>["length"]], Prepend>>>["length"]], Prepend>>["length"]], Prepend>["length"]], Prepend["length"]], Prepend>>>>>>>; }[Prepend>>>>>>>["length"] extends T["length"] ? 1 : 0]; 1: Prepend>>>>>["length"]], Prepend>>>>["length"]], Prepend>>>["length"]], Prepend>>["length"]], Prepend>["length"]], Prepend["length"]], Prepend>>>>>>; }[Prepend>>>>>>["length"] extends T["length"] ? 1 : 0]; 1: Prepend>>>>["length"]], Prepend>>>["length"]], Prepend>>["length"]], Prepend>["length"]], Prepend["length"]], Prepend>>>>>; }[Prepend>>>>>["length"] extends T["length"] ? 1 : 0]; 1: Prepend>>>["length"]], Prepend>>["length"]], Prepend>["length"]], Prepend["length"]], Prepend>>>>; }[Prepend>>>>["length"] extends T["length"] ? 1 : 0]; 1: Prepend>>["length"]], Prepend>["length"]], Prepend["length"]], Prepend>>>; }[Prepend>>>["length"] extends T["length"] ? 1 : 0]; 1: Prepend>["length"]], Prepend["length"]], Prepend>>; }[Prepend>>["length"] extends T["length"] ? 1 : 0]; 1: Prepend["length"]], Prepend>; }[Prepend>["length"] extends T["length"] ? 1 : 0]; 1: Prepend; }[Prepend["length"] extends T["length"] ? 1 : 0] + + 1: R; +>1 : R + + }[ + Pos extends Length + ? 1 + : 0 + ]; + + type Concat = +>Concat : { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[11 extends (any[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)["length"] ? 1 : 0]; 1: Prepend<(any[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[9], Prepend<(any[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[8], Prepend<(any[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[7], Prepend<(any[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[6], Prepend<(any[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[5], Prepend<(any[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[4], Prepend<(any[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[3], Prepend<(any[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[2], Prepend<(any[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[1], Prepend<(any[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[0], T2>>>>>>>>>>; }[10 extends ({ 0: any[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)["length"] ? 1 : 0]; 1: Prepend<({ 0: any[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[8], Prepend<({ 0: any[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[7], Prepend<({ 0: any[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[6], Prepend<({ 0: any[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[5], Prepend<({ 0: any[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[4], Prepend<({ 0: any[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[3], Prepend<({ 0: any[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[2], Prepend<({ 0: any[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[1], Prepend<({ 0: any[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[0], T2>>>>>>>>>; }[9 extends ({ 0: { 0: any[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)["length"] ? 1 : 0]; 1: Prepend<({ 0: { 0: any[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[7], Prepend<({ 0: { 0: any[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[6], Prepend<({ 0: { 0: any[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[5], Prepend<({ 0: { 0: any[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[4], Prepend<({ 0: { 0: any[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[3], Prepend<({ 0: { 0: any[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[2], Prepend<({ 0: { 0: any[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[1], Prepend<({ 0: { 0: any[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[0], T2>>>>>>>>; }[8 extends ({ 0: { 0: { 0: any[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)["length"] ? 1 : 0]; 1: Prepend<({ 0: { 0: { 0: any[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[6], Prepend<({ 0: { 0: { 0: any[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[5], Prepend<({ 0: { 0: { 0: any[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[4], Prepend<({ 0: { 0: { 0: any[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[3], Prepend<({ 0: { 0: { 0: any[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[2], Prepend<({ 0: { 0: { 0: any[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[1], Prepend<({ 0: { 0: { 0: any[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[0], T2>>>>>>>; }[7 extends ({ 0: { 0: { 0: { 0: any[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)["length"] ? 1 : 0]; 1: Prepend<({ 0: { 0: { 0: { 0: any[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[5], Prepend<({ 0: { 0: { 0: { 0: any[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[4], Prepend<({ 0: { 0: { 0: { 0: any[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[3], Prepend<({ 0: { 0: { 0: { 0: any[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[2], Prepend<({ 0: { 0: { 0: { 0: any[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[1], Prepend<({ 0: { 0: { 0: { 0: any[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[0], T2>>>>>>; }[6 extends ({ 0: { 0: { 0: { 0: { 0: any[5 extends T1["length"] ? 1 : 0]; 1: [T1[3], T1[2], T1[1], T1[0]]; }[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)["length"] ? 1 : 0]; 1: Prepend<({ 0: { 0: { 0: { 0: { 0: any[5 extends T1["length"] ? 1 : 0]; 1: [T1[3], T1[2], T1[1], T1[0]]; }[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[4], Prepend<({ 0: { 0: { 0: { 0: { 0: any[5 extends T1["length"] ? 1 : 0]; 1: [T1[3], T1[2], T1[1], T1[0]]; }[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[3], Prepend<({ 0: { 0: { 0: { 0: { 0: any[5 extends T1["length"] ? 1 : 0]; 1: [T1[3], T1[2], T1[1], T1[0]]; }[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[2], Prepend<({ 0: { 0: { 0: { 0: { 0: any[5 extends T1["length"] ? 1 : 0]; 1: [T1[3], T1[2], T1[1], T1[0]]; }[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[1], Prepend<({ 0: { 0: { 0: { 0: { 0: any[5 extends T1["length"] ? 1 : 0]; 1: [T1[3], T1[2], T1[1], T1[0]]; }[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[0], T2>>>>>; }[5 extends ({ 0: { 0: { 0: { 0: { 0: { 0: any[6 extends T1["length"] ? 1 : 0]; 1: [T1[4], T1[3], T1[2], T1[1], T1[0]]; }[5 extends T1["length"] ? 1 : 0]; 1: [T1[3], T1[2], T1[1], T1[0]]; }[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)["length"] ? 1 : 0]; 1: Prepend<({ 0: { 0: { 0: { 0: { 0: { 0: any[6 extends T1["length"] ? 1 : 0]; 1: [T1[4], T1[3], T1[2], T1[1], T1[0]]; }[5 extends T1["length"] ? 1 : 0]; 1: [T1[3], T1[2], T1[1], T1[0]]; }[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[3], Prepend<({ 0: { 0: { 0: { 0: { 0: { 0: any[6 extends T1["length"] ? 1 : 0]; 1: [T1[4], T1[3], T1[2], T1[1], T1[0]]; }[5 extends T1["length"] ? 1 : 0]; 1: [T1[3], T1[2], T1[1], T1[0]]; }[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[2], Prepend<({ 0: { 0: { 0: { 0: { 0: { 0: any[6 extends T1["length"] ? 1 : 0]; 1: [T1[4], T1[3], T1[2], T1[1], T1[0]]; }[5 extends T1["length"] ? 1 : 0]; 1: [T1[3], T1[2], T1[1], T1[0]]; }[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[1], Prepend<({ 0: { 0: { 0: { 0: { 0: { 0: any[6 extends T1["length"] ? 1 : 0]; 1: [T1[4], T1[3], T1[2], T1[1], T1[0]]; }[5 extends T1["length"] ? 1 : 0]; 1: [T1[3], T1[2], T1[1], T1[0]]; }[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[0], T2>>>>; }[4 extends ({ 0: { 0: { 0: { 0: { 0: { 0: { 0: any[7 extends T1["length"] ? 1 : 0]; 1: [T1[5], T1[4], T1[3], T1[2], T1[1], T1[0]]; }[6 extends T1["length"] ? 1 : 0]; 1: [T1[4], T1[3], T1[2], T1[1], T1[0]]; }[5 extends T1["length"] ? 1 : 0]; 1: [T1[3], T1[2], T1[1], T1[0]]; }[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)["length"] ? 1 : 0]; 1: Prepend<({ 0: { 0: { 0: { 0: { 0: { 0: { 0: any[7 extends T1["length"] ? 1 : 0]; 1: [T1[5], T1[4], T1[3], T1[2], T1[1], T1[0]]; }[6 extends T1["length"] ? 1 : 0]; 1: [T1[4], T1[3], T1[2], T1[1], T1[0]]; }[5 extends T1["length"] ? 1 : 0]; 1: [T1[3], T1[2], T1[1], T1[0]]; }[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[2], Prepend<({ 0: { 0: { 0: { 0: { 0: { 0: { 0: any[7 extends T1["length"] ? 1 : 0]; 1: [T1[5], T1[4], T1[3], T1[2], T1[1], T1[0]]; }[6 extends T1["length"] ? 1 : 0]; 1: [T1[4], T1[3], T1[2], T1[1], T1[0]]; }[5 extends T1["length"] ? 1 : 0]; 1: [T1[3], T1[2], T1[1], T1[0]]; }[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[1], Prepend<({ 0: { 0: { 0: { 0: { 0: { 0: { 0: any[7 extends T1["length"] ? 1 : 0]; 1: [T1[5], T1[4], T1[3], T1[2], T1[1], T1[0]]; }[6 extends T1["length"] ? 1 : 0]; 1: [T1[4], T1[3], T1[2], T1[1], T1[0]]; }[5 extends T1["length"] ? 1 : 0]; 1: [T1[3], T1[2], T1[1], T1[0]]; }[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[0], T2>>>; }[3 extends ({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[8 extends T1["length"] ? 1 : 0]; 1: [T1[6], T1[5], T1[4], T1[3], T1[2], T1[1], T1[0]]; }[7 extends T1["length"] ? 1 : 0]; 1: [T1[5], T1[4], T1[3], T1[2], T1[1], T1[0]]; }[6 extends T1["length"] ? 1 : 0]; 1: [T1[4], T1[3], T1[2], T1[1], T1[0]]; }[5 extends T1["length"] ? 1 : 0]; 1: [T1[3], T1[2], T1[1], T1[0]]; }[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)["length"] ? 1 : 0]; 1: Prepend<({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[8 extends T1["length"] ? 1 : 0]; 1: [T1[6], T1[5], T1[4], T1[3], T1[2], T1[1], T1[0]]; }[7 extends T1["length"] ? 1 : 0]; 1: [T1[5], T1[4], T1[3], T1[2], T1[1], T1[0]]; }[6 extends T1["length"] ? 1 : 0]; 1: [T1[4], T1[3], T1[2], T1[1], T1[0]]; }[5 extends T1["length"] ? 1 : 0]; 1: [T1[3], T1[2], T1[1], T1[0]]; }[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[1], Prepend<({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[8 extends T1["length"] ? 1 : 0]; 1: [T1[6], T1[5], T1[4], T1[3], T1[2], T1[1], T1[0]]; }[7 extends T1["length"] ? 1 : 0]; 1: [T1[5], T1[4], T1[3], T1[2], T1[1], T1[0]]; }[6 extends T1["length"] ? 1 : 0]; 1: [T1[4], T1[3], T1[2], T1[1], T1[0]]; }[5 extends T1["length"] ? 1 : 0]; 1: [T1[3], T1[2], T1[1], T1[0]]; }[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[0], T2>>; }[2 extends ({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[9 extends T1["length"] ? 1 : 0]; 1: [T1[7], T1[6], T1[5], T1[4], T1[3], T1[2], T1[1], T1[0]]; }[8 extends T1["length"] ? 1 : 0]; 1: [T1[6], T1[5], T1[4], T1[3], T1[2], T1[1], T1[0]]; }[7 extends T1["length"] ? 1 : 0]; 1: [T1[5], T1[4], T1[3], T1[2], T1[1], T1[0]]; }[6 extends T1["length"] ? 1 : 0]; 1: [T1[4], T1[3], T1[2], T1[1], T1[0]]; }[5 extends T1["length"] ? 1 : 0]; 1: [T1[3], T1[2], T1[1], T1[0]]; }[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)["length"] ? 1 : 0]; 1: Prepend<({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[9 extends T1["length"] ? 1 : 0]; 1: [T1[7], T1[6], T1[5], T1[4], T1[3], T1[2], T1[1], T1[0]]; }[8 extends T1["length"] ? 1 : 0]; 1: [T1[6], T1[5], T1[4], T1[3], T1[2], T1[1], T1[0]]; }[7 extends T1["length"] ? 1 : 0]; 1: [T1[5], T1[4], T1[3], T1[2], T1[1], T1[0]]; }[6 extends T1["length"] ? 1 : 0]; 1: [T1[4], T1[3], T1[2], T1[1], T1[0]]; }[5 extends T1["length"] ? 1 : 0]; 1: [T1[3], T1[2], T1[1], T1[0]]; }[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)[0], T2>; }[1 extends ({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[10 extends T1["length"] ? 1 : 0]; 1: [T1[8], T1[7], T1[6], T1[5], T1[4], T1[3], T1[2], T1[1], T1[0]]; }[9 extends T1["length"] ? 1 : 0]; 1: [T1[7], T1[6], T1[5], T1[4], T1[3], T1[2], T1[1], T1[0]]; }[8 extends T1["length"] ? 1 : 0]; 1: [T1[6], T1[5], T1[4], T1[3], T1[2], T1[1], T1[0]]; }[7 extends T1["length"] ? 1 : 0]; 1: [T1[5], T1[4], T1[3], T1[2], T1[1], T1[0]]; }[6 extends T1["length"] ? 1 : 0]; 1: [T1[4], T1[3], T1[2], T1[1], T1[0]]; }[5 extends T1["length"] ? 1 : 0]; 1: [T1[3], T1[2], T1[1], T1[0]]; }[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)["length"] ? 1 : 0]; 1: T2; }[0 extends ({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[11 extends T1["length"] ? 1 : 0]; 1: [T1[9], T1[8], T1[7], T1[6], T1[5], T1[4], T1[3], T1[2], T1[1], T1[0]]; }[10 extends T1["length"] ? 1 : 0]; 1: [T1[8], T1[7], T1[6], T1[5], T1[4], T1[3], T1[2], T1[1], T1[0]]; }[9 extends T1["length"] ? 1 : 0]; 1: [T1[7], T1[6], T1[5], T1[4], T1[3], T1[2], T1[1], T1[0]]; }[8 extends T1["length"] ? 1 : 0]; 1: [T1[6], T1[5], T1[4], T1[3], T1[2], T1[1], T1[0]]; }[7 extends T1["length"] ? 1 : 0]; 1: [T1[5], T1[4], T1[3], T1[2], T1[1], T1[0]]; }[6 extends T1["length"] ? 1 : 0]; 1: [T1[4], T1[3], T1[2], T1[1], T1[0]]; }[5 extends T1["length"] ? 1 : 0]; 1: [T1[3], T1[2], T1[1], T1[0]]; }[4 extends T1["length"] ? 1 : 0]; 1: [T1[2], T1[1], T1[0]]; }[3 extends T1["length"] ? 1 : 0]; 1: [T1[1], T1[0]]; }[2 extends T1["length"] ? 1 : 0]; 1: [T1[0]]; }[1 extends T1["length"] ? 1 : 0]; 1: []; }[0 extends T1["length"] ? 1 : 0] extends infer R ? Cast : never)["length"] ? 1 : 0] + + Reverse extends infer R ? Cast : never, T2>; + + type Append = +>Append : { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[11 extends (any[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)["length"] ? 1 : 0]; 1: [(any[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[9], (any[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[8], (any[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[7], (any[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[6], (any[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[5], (any[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[4], (any[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[3], (any[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[2], (any[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[1], (any[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[0], E]; }[10 extends ({ 0: any[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)["length"] ? 1 : 0]; 1: [({ 0: any[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[8], ({ 0: any[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[7], ({ 0: any[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[6], ({ 0: any[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[5], ({ 0: any[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[4], ({ 0: any[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[3], ({ 0: any[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[2], ({ 0: any[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[1], ({ 0: any[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[0], E]; }[9 extends ({ 0: { 0: any[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)["length"] ? 1 : 0]; 1: [({ 0: { 0: any[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[7], ({ 0: { 0: any[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[6], ({ 0: { 0: any[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[5], ({ 0: { 0: any[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[4], ({ 0: { 0: any[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[3], ({ 0: { 0: any[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[2], ({ 0: { 0: any[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[1], ({ 0: { 0: any[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[0], E]; }[8 extends ({ 0: { 0: { 0: any[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)["length"] ? 1 : 0]; 1: [({ 0: { 0: { 0: any[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[6], ({ 0: { 0: { 0: any[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[5], ({ 0: { 0: { 0: any[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[4], ({ 0: { 0: { 0: any[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[3], ({ 0: { 0: { 0: any[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[2], ({ 0: { 0: { 0: any[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[1], ({ 0: { 0: { 0: any[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[0], E]; }[7 extends ({ 0: { 0: { 0: { 0: any[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)["length"] ? 1 : 0]; 1: [({ 0: { 0: { 0: { 0: any[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[5], ({ 0: { 0: { 0: { 0: any[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[4], ({ 0: { 0: { 0: { 0: any[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[3], ({ 0: { 0: { 0: { 0: any[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[2], ({ 0: { 0: { 0: { 0: any[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[1], ({ 0: { 0: { 0: { 0: any[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[0], E]; }[6 extends ({ 0: { 0: { 0: { 0: { 0: any[5 extends T["length"] ? 1 : 0]; 1: [T[3], T[2], T[1], T[0]]; }[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)["length"] ? 1 : 0]; 1: [({ 0: { 0: { 0: { 0: { 0: any[5 extends T["length"] ? 1 : 0]; 1: [T[3], T[2], T[1], T[0]]; }[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[4], ({ 0: { 0: { 0: { 0: { 0: any[5 extends T["length"] ? 1 : 0]; 1: [T[3], T[2], T[1], T[0]]; }[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[3], ({ 0: { 0: { 0: { 0: { 0: any[5 extends T["length"] ? 1 : 0]; 1: [T[3], T[2], T[1], T[0]]; }[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[2], ({ 0: { 0: { 0: { 0: { 0: any[5 extends T["length"] ? 1 : 0]; 1: [T[3], T[2], T[1], T[0]]; }[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[1], ({ 0: { 0: { 0: { 0: { 0: any[5 extends T["length"] ? 1 : 0]; 1: [T[3], T[2], T[1], T[0]]; }[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[0], E]; }[5 extends ({ 0: { 0: { 0: { 0: { 0: { 0: any[6 extends T["length"] ? 1 : 0]; 1: [T[4], T[3], T[2], T[1], T[0]]; }[5 extends T["length"] ? 1 : 0]; 1: [T[3], T[2], T[1], T[0]]; }[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)["length"] ? 1 : 0]; 1: [({ 0: { 0: { 0: { 0: { 0: { 0: any[6 extends T["length"] ? 1 : 0]; 1: [T[4], T[3], T[2], T[1], T[0]]; }[5 extends T["length"] ? 1 : 0]; 1: [T[3], T[2], T[1], T[0]]; }[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[3], ({ 0: { 0: { 0: { 0: { 0: { 0: any[6 extends T["length"] ? 1 : 0]; 1: [T[4], T[3], T[2], T[1], T[0]]; }[5 extends T["length"] ? 1 : 0]; 1: [T[3], T[2], T[1], T[0]]; }[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[2], ({ 0: { 0: { 0: { 0: { 0: { 0: any[6 extends T["length"] ? 1 : 0]; 1: [T[4], T[3], T[2], T[1], T[0]]; }[5 extends T["length"] ? 1 : 0]; 1: [T[3], T[2], T[1], T[0]]; }[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[1], ({ 0: { 0: { 0: { 0: { 0: { 0: any[6 extends T["length"] ? 1 : 0]; 1: [T[4], T[3], T[2], T[1], T[0]]; }[5 extends T["length"] ? 1 : 0]; 1: [T[3], T[2], T[1], T[0]]; }[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[0], E]; }[4 extends ({ 0: { 0: { 0: { 0: { 0: { 0: { 0: any[7 extends T["length"] ? 1 : 0]; 1: [T[5], T[4], T[3], T[2], T[1], T[0]]; }[6 extends T["length"] ? 1 : 0]; 1: [T[4], T[3], T[2], T[1], T[0]]; }[5 extends T["length"] ? 1 : 0]; 1: [T[3], T[2], T[1], T[0]]; }[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)["length"] ? 1 : 0]; 1: [({ 0: { 0: { 0: { 0: { 0: { 0: { 0: any[7 extends T["length"] ? 1 : 0]; 1: [T[5], T[4], T[3], T[2], T[1], T[0]]; }[6 extends T["length"] ? 1 : 0]; 1: [T[4], T[3], T[2], T[1], T[0]]; }[5 extends T["length"] ? 1 : 0]; 1: [T[3], T[2], T[1], T[0]]; }[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[2], ({ 0: { 0: { 0: { 0: { 0: { 0: { 0: any[7 extends T["length"] ? 1 : 0]; 1: [T[5], T[4], T[3], T[2], T[1], T[0]]; }[6 extends T["length"] ? 1 : 0]; 1: [T[4], T[3], T[2], T[1], T[0]]; }[5 extends T["length"] ? 1 : 0]; 1: [T[3], T[2], T[1], T[0]]; }[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[1], ({ 0: { 0: { 0: { 0: { 0: { 0: { 0: any[7 extends T["length"] ? 1 : 0]; 1: [T[5], T[4], T[3], T[2], T[1], T[0]]; }[6 extends T["length"] ? 1 : 0]; 1: [T[4], T[3], T[2], T[1], T[0]]; }[5 extends T["length"] ? 1 : 0]; 1: [T[3], T[2], T[1], T[0]]; }[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[0], E]; }[3 extends ({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[8 extends T["length"] ? 1 : 0]; 1: [T[6], T[5], T[4], T[3], T[2], T[1], T[0]]; }[7 extends T["length"] ? 1 : 0]; 1: [T[5], T[4], T[3], T[2], T[1], T[0]]; }[6 extends T["length"] ? 1 : 0]; 1: [T[4], T[3], T[2], T[1], T[0]]; }[5 extends T["length"] ? 1 : 0]; 1: [T[3], T[2], T[1], T[0]]; }[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)["length"] ? 1 : 0]; 1: [({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[8 extends T["length"] ? 1 : 0]; 1: [T[6], T[5], T[4], T[3], T[2], T[1], T[0]]; }[7 extends T["length"] ? 1 : 0]; 1: [T[5], T[4], T[3], T[2], T[1], T[0]]; }[6 extends T["length"] ? 1 : 0]; 1: [T[4], T[3], T[2], T[1], T[0]]; }[5 extends T["length"] ? 1 : 0]; 1: [T[3], T[2], T[1], T[0]]; }[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[1], ({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[8 extends T["length"] ? 1 : 0]; 1: [T[6], T[5], T[4], T[3], T[2], T[1], T[0]]; }[7 extends T["length"] ? 1 : 0]; 1: [T[5], T[4], T[3], T[2], T[1], T[0]]; }[6 extends T["length"] ? 1 : 0]; 1: [T[4], T[3], T[2], T[1], T[0]]; }[5 extends T["length"] ? 1 : 0]; 1: [T[3], T[2], T[1], T[0]]; }[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[0], E]; }[2 extends ({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[9 extends T["length"] ? 1 : 0]; 1: [T[7], T[6], T[5], T[4], T[3], T[2], T[1], T[0]]; }[8 extends T["length"] ? 1 : 0]; 1: [T[6], T[5], T[4], T[3], T[2], T[1], T[0]]; }[7 extends T["length"] ? 1 : 0]; 1: [T[5], T[4], T[3], T[2], T[1], T[0]]; }[6 extends T["length"] ? 1 : 0]; 1: [T[4], T[3], T[2], T[1], T[0]]; }[5 extends T["length"] ? 1 : 0]; 1: [T[3], T[2], T[1], T[0]]; }[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)["length"] ? 1 : 0]; 1: [({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[9 extends T["length"] ? 1 : 0]; 1: [T[7], T[6], T[5], T[4], T[3], T[2], T[1], T[0]]; }[8 extends T["length"] ? 1 : 0]; 1: [T[6], T[5], T[4], T[3], T[2], T[1], T[0]]; }[7 extends T["length"] ? 1 : 0]; 1: [T[5], T[4], T[3], T[2], T[1], T[0]]; }[6 extends T["length"] ? 1 : 0]; 1: [T[4], T[3], T[2], T[1], T[0]]; }[5 extends T["length"] ? 1 : 0]; 1: [T[3], T[2], T[1], T[0]]; }[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)[0], E]; }[1 extends ({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[10 extends T["length"] ? 1 : 0]; 1: [T[8], T[7], T[6], T[5], T[4], T[3], T[2], T[1], T[0]]; }[9 extends T["length"] ? 1 : 0]; 1: [T[7], T[6], T[5], T[4], T[3], T[2], T[1], T[0]]; }[8 extends T["length"] ? 1 : 0]; 1: [T[6], T[5], T[4], T[3], T[2], T[1], T[0]]; }[7 extends T["length"] ? 1 : 0]; 1: [T[5], T[4], T[3], T[2], T[1], T[0]]; }[6 extends T["length"] ? 1 : 0]; 1: [T[4], T[3], T[2], T[1], T[0]]; }[5 extends T["length"] ? 1 : 0]; 1: [T[3], T[2], T[1], T[0]]; }[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)["length"] ? 1 : 0]; 1: [E]; }[0 extends ({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[11 extends T["length"] ? 1 : 0]; 1: [T[9], T[8], T[7], T[6], T[5], T[4], T[3], T[2], T[1], T[0]]; }[10 extends T["length"] ? 1 : 0]; 1: [T[8], T[7], T[6], T[5], T[4], T[3], T[2], T[1], T[0]]; }[9 extends T["length"] ? 1 : 0]; 1: [T[7], T[6], T[5], T[4], T[3], T[2], T[1], T[0]]; }[8 extends T["length"] ? 1 : 0]; 1: [T[6], T[5], T[4], T[3], T[2], T[1], T[0]]; }[7 extends T["length"] ? 1 : 0]; 1: [T[5], T[4], T[3], T[2], T[1], T[0]]; }[6 extends T["length"] ? 1 : 0]; 1: [T[4], T[3], T[2], T[1], T[0]]; }[5 extends T["length"] ? 1 : 0]; 1: [T[3], T[2], T[1], T[0]]; }[4 extends T["length"] ? 1 : 0]; 1: [T[2], T[1], T[0]]; }[3 extends T["length"] ? 1 : 0]; 1: [T[1], T[0]]; }[2 extends T["length"] ? 1 : 0]; 1: [T[0]]; }[1 extends T["length"] ? 1 : 0]; 1: []; }[0 extends T["length"] ? 1 : 0] extends infer R ? Cast : never)["length"] ? 1 : 0] + + Concat; + + type ValueOfRecord = R extends Record ? T : never; +>ValueOfRecord : ValueOfRecord +} + +declare namespace R { + export type Placeholder = { __placeholder: void }; +>Placeholder : Placeholder +>__placeholder : void +} + +declare namespace Curry { + type GapOf = +>GapOf : GapOf + + T1[Tools.Pos] extends R.Placeholder +>Tools : any +>R : any + + ? Tools.Append], TN> +>Tools : any +>Tools : any + + : TN; + + interface GapsOfWorker { + 0: GapsOf extends infer G ? Tools.Cast : never, Tools.Next>; +>0 : GapsOfWorker extends infer G ? Tools.Cast : never, Tools.Prepend>[Tools.Prepend["length"] extends T1["length"] ? 1 : 0] +>Tools : any +>Tools : any + + 1: Tools.Concat, T2> extends infer D ? Tools.Cast : never>; +>1 : { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[11 extends (any[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)["length"] ? 1 : 0]; 1: [(any[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[9], (any[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[8], (any[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[7], (any[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[6], (any[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[5], (any[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[4], (any[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[3], (any[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[2], (any[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[1], (any[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[0], ...({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[11 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>>>; }[10 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>>; }[9 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>; }[8 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>; }[7 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>; }[6 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>; }[5 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>; }[4 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>; }[3 extends I["length"] ? 1 : 0]; 1: Tools.Tail>; }[2 extends I["length"] ? 1 : 0]; 1: Tools.Tail; }[1 extends I["length"] ? 1 : 0]; 1: T2; }[0 extends I["length"] ? 1 : 0] extends infer D ? Tools.Cast : never)[number][]]; }[10 extends ({ 0: any[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)["length"] ? 1 : 0]; 1: [({ 0: any[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[8], ({ 0: any[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[7], ({ 0: any[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[6], ({ 0: any[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[5], ({ 0: any[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[4], ({ 0: any[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[3], ({ 0: any[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[2], ({ 0: any[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[1], ({ 0: any[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[0], ...({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[11 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>>>; }[10 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>>; }[9 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>; }[8 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>; }[7 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>; }[6 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>; }[5 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>; }[4 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>; }[3 extends I["length"] ? 1 : 0]; 1: Tools.Tail>; }[2 extends I["length"] ? 1 : 0]; 1: Tools.Tail; }[1 extends I["length"] ? 1 : 0]; 1: T2; }[0 extends I["length"] ? 1 : 0] extends infer D ? Tools.Cast : never)[number][]]; }[9 extends ({ 0: { 0: any[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)["length"] ? 1 : 0]; 1: [({ 0: { 0: any[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[7], ({ 0: { 0: any[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[6], ({ 0: { 0: any[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[5], ({ 0: { 0: any[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[4], ({ 0: { 0: any[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[3], ({ 0: { 0: any[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[2], ({ 0: { 0: any[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[1], ({ 0: { 0: any[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[0], ...({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[11 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>>>; }[10 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>>; }[9 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>; }[8 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>; }[7 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>; }[6 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>; }[5 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>; }[4 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>; }[3 extends I["length"] ? 1 : 0]; 1: Tools.Tail>; }[2 extends I["length"] ? 1 : 0]; 1: Tools.Tail; }[1 extends I["length"] ? 1 : 0]; 1: T2; }[0 extends I["length"] ? 1 : 0] extends infer D ? Tools.Cast : never)[number][]]; }[8 extends ({ 0: { 0: { 0: any[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)["length"] ? 1 : 0]; 1: [({ 0: { 0: { 0: any[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[6], ({ 0: { 0: { 0: any[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[5], ({ 0: { 0: { 0: any[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[4], ({ 0: { 0: { 0: any[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[3], ({ 0: { 0: { 0: any[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[2], ({ 0: { 0: { 0: any[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[1], ({ 0: { 0: { 0: any[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[0], ...({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[11 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>>>; }[10 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>>; }[9 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>; }[8 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>; }[7 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>; }[6 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>; }[5 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>; }[4 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>; }[3 extends I["length"] ? 1 : 0]; 1: Tools.Tail>; }[2 extends I["length"] ? 1 : 0]; 1: Tools.Tail; }[1 extends I["length"] ? 1 : 0]; 1: T2; }[0 extends I["length"] ? 1 : 0] extends infer D ? Tools.Cast : never)[number][]]; }[7 extends ({ 0: { 0: { 0: { 0: any[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)["length"] ? 1 : 0]; 1: [({ 0: { 0: { 0: { 0: any[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[5], ({ 0: { 0: { 0: { 0: any[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[4], ({ 0: { 0: { 0: { 0: any[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[3], ({ 0: { 0: { 0: { 0: any[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[2], ({ 0: { 0: { 0: { 0: any[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[1], ({ 0: { 0: { 0: { 0: any[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[0], ...({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[11 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>>>; }[10 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>>; }[9 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>; }[8 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>; }[7 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>; }[6 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>; }[5 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>; }[4 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>; }[3 extends I["length"] ? 1 : 0]; 1: Tools.Tail>; }[2 extends I["length"] ? 1 : 0]; 1: Tools.Tail; }[1 extends I["length"] ? 1 : 0]; 1: T2; }[0 extends I["length"] ? 1 : 0] extends infer D ? Tools.Cast : never)[number][]]; }[6 extends ({ 0: { 0: { 0: { 0: { 0: any[5 extends TN["length"] ? 1 : 0]; 1: [TN[3], TN[2], TN[1], TN[0]]; }[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)["length"] ? 1 : 0]; 1: [({ 0: { 0: { 0: { 0: { 0: any[5 extends TN["length"] ? 1 : 0]; 1: [TN[3], TN[2], TN[1], TN[0]]; }[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[4], ({ 0: { 0: { 0: { 0: { 0: any[5 extends TN["length"] ? 1 : 0]; 1: [TN[3], TN[2], TN[1], TN[0]]; }[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[3], ({ 0: { 0: { 0: { 0: { 0: any[5 extends TN["length"] ? 1 : 0]; 1: [TN[3], TN[2], TN[1], TN[0]]; }[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[2], ({ 0: { 0: { 0: { 0: { 0: any[5 extends TN["length"] ? 1 : 0]; 1: [TN[3], TN[2], TN[1], TN[0]]; }[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[1], ({ 0: { 0: { 0: { 0: { 0: any[5 extends TN["length"] ? 1 : 0]; 1: [TN[3], TN[2], TN[1], TN[0]]; }[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[0], ...({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[11 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>>>; }[10 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>>; }[9 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>; }[8 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>; }[7 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>; }[6 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>; }[5 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>; }[4 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>; }[3 extends I["length"] ? 1 : 0]; 1: Tools.Tail>; }[2 extends I["length"] ? 1 : 0]; 1: Tools.Tail; }[1 extends I["length"] ? 1 : 0]; 1: T2; }[0 extends I["length"] ? 1 : 0] extends infer D ? Tools.Cast : never)[number][]]; }[5 extends ({ 0: { 0: { 0: { 0: { 0: { 0: any[6 extends TN["length"] ? 1 : 0]; 1: [TN[4], TN[3], TN[2], TN[1], TN[0]]; }[5 extends TN["length"] ? 1 : 0]; 1: [TN[3], TN[2], TN[1], TN[0]]; }[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)["length"] ? 1 : 0]; 1: [({ 0: { 0: { 0: { 0: { 0: { 0: any[6 extends TN["length"] ? 1 : 0]; 1: [TN[4], TN[3], TN[2], TN[1], TN[0]]; }[5 extends TN["length"] ? 1 : 0]; 1: [TN[3], TN[2], TN[1], TN[0]]; }[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[3], ({ 0: { 0: { 0: { 0: { 0: { 0: any[6 extends TN["length"] ? 1 : 0]; 1: [TN[4], TN[3], TN[2], TN[1], TN[0]]; }[5 extends TN["length"] ? 1 : 0]; 1: [TN[3], TN[2], TN[1], TN[0]]; }[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[2], ({ 0: { 0: { 0: { 0: { 0: { 0: any[6 extends TN["length"] ? 1 : 0]; 1: [TN[4], TN[3], TN[2], TN[1], TN[0]]; }[5 extends TN["length"] ? 1 : 0]; 1: [TN[3], TN[2], TN[1], TN[0]]; }[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[1], ({ 0: { 0: { 0: { 0: { 0: { 0: any[6 extends TN["length"] ? 1 : 0]; 1: [TN[4], TN[3], TN[2], TN[1], TN[0]]; }[5 extends TN["length"] ? 1 : 0]; 1: [TN[3], TN[2], TN[1], TN[0]]; }[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[0], ...({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[11 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>>>; }[10 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>>; }[9 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>; }[8 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>; }[7 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>; }[6 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>; }[5 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>; }[4 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>; }[3 extends I["length"] ? 1 : 0]; 1: Tools.Tail>; }[2 extends I["length"] ? 1 : 0]; 1: Tools.Tail; }[1 extends I["length"] ? 1 : 0]; 1: T2; }[0 extends I["length"] ? 1 : 0] extends infer D ? Tools.Cast : never)[number][]]; }[4 extends ({ 0: { 0: { 0: { 0: { 0: { 0: { 0: any[7 extends TN["length"] ? 1 : 0]; 1: [TN[5], TN[4], TN[3], TN[2], TN[1], TN[0]]; }[6 extends TN["length"] ? 1 : 0]; 1: [TN[4], TN[3], TN[2], TN[1], TN[0]]; }[5 extends TN["length"] ? 1 : 0]; 1: [TN[3], TN[2], TN[1], TN[0]]; }[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)["length"] ? 1 : 0]; 1: [({ 0: { 0: { 0: { 0: { 0: { 0: { 0: any[7 extends TN["length"] ? 1 : 0]; 1: [TN[5], TN[4], TN[3], TN[2], TN[1], TN[0]]; }[6 extends TN["length"] ? 1 : 0]; 1: [TN[4], TN[3], TN[2], TN[1], TN[0]]; }[5 extends TN["length"] ? 1 : 0]; 1: [TN[3], TN[2], TN[1], TN[0]]; }[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[2], ({ 0: { 0: { 0: { 0: { 0: { 0: { 0: any[7 extends TN["length"] ? 1 : 0]; 1: [TN[5], TN[4], TN[3], TN[2], TN[1], TN[0]]; }[6 extends TN["length"] ? 1 : 0]; 1: [TN[4], TN[3], TN[2], TN[1], TN[0]]; }[5 extends TN["length"] ? 1 : 0]; 1: [TN[3], TN[2], TN[1], TN[0]]; }[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[1], ({ 0: { 0: { 0: { 0: { 0: { 0: { 0: any[7 extends TN["length"] ? 1 : 0]; 1: [TN[5], TN[4], TN[3], TN[2], TN[1], TN[0]]; }[6 extends TN["length"] ? 1 : 0]; 1: [TN[4], TN[3], TN[2], TN[1], TN[0]]; }[5 extends TN["length"] ? 1 : 0]; 1: [TN[3], TN[2], TN[1], TN[0]]; }[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[0], ...({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[11 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>>>; }[10 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>>; }[9 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>; }[8 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>; }[7 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>; }[6 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>; }[5 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>; }[4 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>; }[3 extends I["length"] ? 1 : 0]; 1: Tools.Tail>; }[2 extends I["length"] ? 1 : 0]; 1: Tools.Tail; }[1 extends I["length"] ? 1 : 0]; 1: T2; }[0 extends I["length"] ? 1 : 0] extends infer D ? Tools.Cast : never)[number][]]; }[3 extends ({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[8 extends TN["length"] ? 1 : 0]; 1: [TN[6], TN[5], TN[4], TN[3], TN[2], TN[1], TN[0]]; }[7 extends TN["length"] ? 1 : 0]; 1: [TN[5], TN[4], TN[3], TN[2], TN[1], TN[0]]; }[6 extends TN["length"] ? 1 : 0]; 1: [TN[4], TN[3], TN[2], TN[1], TN[0]]; }[5 extends TN["length"] ? 1 : 0]; 1: [TN[3], TN[2], TN[1], TN[0]]; }[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)["length"] ? 1 : 0]; 1: [({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[8 extends TN["length"] ? 1 : 0]; 1: [TN[6], TN[5], TN[4], TN[3], TN[2], TN[1], TN[0]]; }[7 extends TN["length"] ? 1 : 0]; 1: [TN[5], TN[4], TN[3], TN[2], TN[1], TN[0]]; }[6 extends TN["length"] ? 1 : 0]; 1: [TN[4], TN[3], TN[2], TN[1], TN[0]]; }[5 extends TN["length"] ? 1 : 0]; 1: [TN[3], TN[2], TN[1], TN[0]]; }[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[1], ({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[8 extends TN["length"] ? 1 : 0]; 1: [TN[6], TN[5], TN[4], TN[3], TN[2], TN[1], TN[0]]; }[7 extends TN["length"] ? 1 : 0]; 1: [TN[5], TN[4], TN[3], TN[2], TN[1], TN[0]]; }[6 extends TN["length"] ? 1 : 0]; 1: [TN[4], TN[3], TN[2], TN[1], TN[0]]; }[5 extends TN["length"] ? 1 : 0]; 1: [TN[3], TN[2], TN[1], TN[0]]; }[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[0], ...({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[11 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>>>; }[10 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>>; }[9 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>; }[8 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>; }[7 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>; }[6 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>; }[5 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>; }[4 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>; }[3 extends I["length"] ? 1 : 0]; 1: Tools.Tail>; }[2 extends I["length"] ? 1 : 0]; 1: Tools.Tail; }[1 extends I["length"] ? 1 : 0]; 1: T2; }[0 extends I["length"] ? 1 : 0] extends infer D ? Tools.Cast : never)[number][]]; }[2 extends ({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[9 extends TN["length"] ? 1 : 0]; 1: [TN[7], TN[6], TN[5], TN[4], TN[3], TN[2], TN[1], TN[0]]; }[8 extends TN["length"] ? 1 : 0]; 1: [TN[6], TN[5], TN[4], TN[3], TN[2], TN[1], TN[0]]; }[7 extends TN["length"] ? 1 : 0]; 1: [TN[5], TN[4], TN[3], TN[2], TN[1], TN[0]]; }[6 extends TN["length"] ? 1 : 0]; 1: [TN[4], TN[3], TN[2], TN[1], TN[0]]; }[5 extends TN["length"] ? 1 : 0]; 1: [TN[3], TN[2], TN[1], TN[0]]; }[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)["length"] ? 1 : 0]; 1: [({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[9 extends TN["length"] ? 1 : 0]; 1: [TN[7], TN[6], TN[5], TN[4], TN[3], TN[2], TN[1], TN[0]]; }[8 extends TN["length"] ? 1 : 0]; 1: [TN[6], TN[5], TN[4], TN[3], TN[2], TN[1], TN[0]]; }[7 extends TN["length"] ? 1 : 0]; 1: [TN[5], TN[4], TN[3], TN[2], TN[1], TN[0]]; }[6 extends TN["length"] ? 1 : 0]; 1: [TN[4], TN[3], TN[2], TN[1], TN[0]]; }[5 extends TN["length"] ? 1 : 0]; 1: [TN[3], TN[2], TN[1], TN[0]]; }[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)[0], ...({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[11 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>>>; }[10 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>>; }[9 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>; }[8 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>; }[7 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>; }[6 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>; }[5 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>; }[4 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>; }[3 extends I["length"] ? 1 : 0]; 1: Tools.Tail>; }[2 extends I["length"] ? 1 : 0]; 1: Tools.Tail; }[1 extends I["length"] ? 1 : 0]; 1: T2; }[0 extends I["length"] ? 1 : 0] extends infer D ? Tools.Cast : never)[number][]]; }[1 extends ({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[10 extends TN["length"] ? 1 : 0]; 1: [TN[8], TN[7], TN[6], TN[5], TN[4], TN[3], TN[2], TN[1], TN[0]]; }[9 extends TN["length"] ? 1 : 0]; 1: [TN[7], TN[6], TN[5], TN[4], TN[3], TN[2], TN[1], TN[0]]; }[8 extends TN["length"] ? 1 : 0]; 1: [TN[6], TN[5], TN[4], TN[3], TN[2], TN[1], TN[0]]; }[7 extends TN["length"] ? 1 : 0]; 1: [TN[5], TN[4], TN[3], TN[2], TN[1], TN[0]]; }[6 extends TN["length"] ? 1 : 0]; 1: [TN[4], TN[3], TN[2], TN[1], TN[0]]; }[5 extends TN["length"] ? 1 : 0]; 1: [TN[3], TN[2], TN[1], TN[0]]; }[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)["length"] ? 1 : 0]; 1: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[11 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>>>; }[10 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>>; }[9 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>>; }[8 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>>; }[7 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>>; }[6 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>>; }[5 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>>; }[4 extends I["length"] ? 1 : 0]; 1: Tools.Tail>>; }[3 extends I["length"] ? 1 : 0]; 1: Tools.Tail>; }[2 extends I["length"] ? 1 : 0]; 1: Tools.Tail; }[1 extends I["length"] ? 1 : 0]; 1: T2; }[0 extends I["length"] ? 1 : 0] extends infer D ? Tools.Cast : never; }[0 extends ({ 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: { 0: any[11 extends TN["length"] ? 1 : 0]; 1: [TN[9], TN[8], TN[7], TN[6], TN[5], TN[4], TN[3], TN[2], TN[1], TN[0]]; }[10 extends TN["length"] ? 1 : 0]; 1: [TN[8], TN[7], TN[6], TN[5], TN[4], TN[3], TN[2], TN[1], TN[0]]; }[9 extends TN["length"] ? 1 : 0]; 1: [TN[7], TN[6], TN[5], TN[4], TN[3], TN[2], TN[1], TN[0]]; }[8 extends TN["length"] ? 1 : 0]; 1: [TN[6], TN[5], TN[4], TN[3], TN[2], TN[1], TN[0]]; }[7 extends TN["length"] ? 1 : 0]; 1: [TN[5], TN[4], TN[3], TN[2], TN[1], TN[0]]; }[6 extends TN["length"] ? 1 : 0]; 1: [TN[4], TN[3], TN[2], TN[1], TN[0]]; }[5 extends TN["length"] ? 1 : 0]; 1: [TN[3], TN[2], TN[1], TN[0]]; }[4 extends TN["length"] ? 1 : 0]; 1: [TN[2], TN[1], TN[0]]; }[3 extends TN["length"] ? 1 : 0]; 1: [TN[1], TN[0]]; }[2 extends TN["length"] ? 1 : 0]; 1: [TN[0]]; }[1 extends TN["length"] ? 1 : 0]; 1: []; }[0 extends TN["length"] ? 1 : 0] extends infer R ? Tools.Cast : never)["length"] ? 1 : 0] +>Tools : any +>Tools : any +>Tools : any +>Tools : any + } + type GapsOf = GapsOfWorker[ +>GapsOf : GapsOfWorker[I["length"] extends T1["length"] ? 1 : 0] + + Tools.Pos extends Tools.Length +>Tools : any +>Tools : any + + ? 1 + : 0 + ]; + + type PartialGaps = { +>PartialGaps : PartialGaps + + [K in keyof T]?: T[K] | R.Placeholder +>R : any + + }; + + type CleanedGaps = { +>CleanedGaps : CleanedGaps + + [K in keyof T]: NonNullable + }; + + type Gaps = CleanedGaps>; +>Gaps : CleanedGaps> + + type Curry any)> = +>Curry : Curry +>args : any + + (...args: Tools.Cast>>, any[]>) => +>args : Tools.Cast>>>, any[]> +>Tools : any +>Tools : any + + GapsOf> extends [any, ...any[]] + ? Curry<(...args: GapsOf> extends infer G ? Tools.Cast : never) => ReturnType> +>args : GapsOfWorker, [], []>[0 extends T["length"] ? 1 : 0] extends infer G ? Tools.Cast : never +>Tools : any + + : ReturnType; +} + diff --git a/tests/cases/compiler/ramdaToolsNoInfinite.ts b/tests/cases/compiler/ramdaToolsNoInfinite.ts new file mode 100644 index 0000000000000..3c1bd6010a931 --- /dev/null +++ b/tests/cases/compiler/ramdaToolsNoInfinite.ts @@ -0,0 +1,120 @@ + +// All the following types are explained here: +// https://medium.freecodecamp.org/typescript-curry-ramda-types-f747e99744ab +// https://github.com/pirix-gh/medium/blob/master/types-curry-ramda/src/index.ts +declare namespace Tools { + type Head = + T extends [any, ...any[]] + ? T[0] + : never; + + type Tail = + ((...t: T) => any) extends ((_: any, ...tail: infer TT) => any) + ? TT + : []; + + type HasTail = + T extends ([] | [any]) + ? false + : true; + + type Last = { + 0: Last>; + 1: Head; + }[ + HasTail extends true + ? 0 + : 1 + ]; + + type Length = + T['length']; + + type Prepend = + ((head: E, ...args: T) => any) extends ((...args: infer U) => any) + ? U + : T; + + type Drop = { + 0: Drop, Prepend>; + 1: T; + }[ + Length extends N + ? 1 + : 0 + ]; + + type Cast = X extends Y ? X : Y; + + type Pos = + Length; + + type Next = + Prepend; + + type Prev = + Tail; + + type Iterator = { + 0: Iterator, Next>; + 1: From; + }[ + Pos extends Index + ? 1 + : 0 + ]; + + type Reverse = { + 0: Reverse], R>, Next>; + 1: R; + }[ + Pos extends Length + ? 1 + : 0 + ]; + + type Concat = + Reverse extends infer R ? Cast : never, T2>; + + type Append = + Concat; + + type ValueOfRecord = R extends Record ? T : never; +} + +declare namespace R { + export type Placeholder = { __placeholder: void }; +} + +declare namespace Curry { + type GapOf = + T1[Tools.Pos] extends R.Placeholder + ? Tools.Append], TN> + : TN; + + interface GapsOfWorker { + 0: GapsOf extends infer G ? Tools.Cast : never, Tools.Next>; + 1: Tools.Concat, T2> extends infer D ? Tools.Cast : never>; + } + type GapsOf = GapsOfWorker[ + Tools.Pos extends Tools.Length + ? 1 + : 0 + ]; + + type PartialGaps = { + [K in keyof T]?: T[K] | R.Placeholder + }; + + type CleanedGaps = { + [K in keyof T]: NonNullable + }; + + type Gaps = CleanedGaps>; + + type Curry any)> = + (...args: Tools.Cast>>, any[]>) => + GapsOf> extends [any, ...any[]] + ? Curry<(...args: GapsOf> extends infer G ? Tools.Cast : never) => ReturnType> + : ReturnType; +}