import type Array from "./Array.js"; import Runtype, { type Parsed, type Static } from "./Runtype.js"; import Spread from "./Spread.js"; type Lrt = { leading: L; rest: R; trailing: T; }; type SplitAtSpreadImplRest = R["length"] extends 0 ? Lrt : R extends readonly [...(readonly Spread[])] ? Lrt : Lrt; type SplitAtSpreadImplTrailing = R extends [...infer S, infer X] ? X extends Runtype.Core ? S extends readonly (Runtype.Core | Spread)[] ? SplitAtSpreadImplTrailing : never : SplitAtSpreadImplRest : SplitAtSpreadImplRest; type SplitAtSpreadImplLeading = R extends [infer X, ...infer S] ? X extends Runtype.Core ? S extends readonly (Runtype.Core | Spread)[] ? SplitAtSpreadImplLeading<[...L, X], S, T> : never : SplitAtSpreadImplTrailing : SplitAtSpreadImplTrailing; type SplitAtSpread = SplitAtSpreadImplLeading<[ ], R, [ ]>; type FlattenSplitAtSpread = SplitAtSpread extends Lrt ? R0 extends Array ? Lrt : R0 extends Tuple ? FlattenSplitAtSpread extends Lrt ? { leading: [...L0, ...L1]; rest: R1; trailing: [...T1, ...T0]; } : Lrt : Lrt : never; type MapParsed = { [K in keyof R]: Parsed; }; type TupleParsed = FlattenSplitAtSpread extends infer X ? X extends Lrt ? R extends Runtype.Core ? [...MapParsed, ...Parsed, ...MapParsed] : [...MapParsed, ...MapParsed] : never : never; type MapStatic = { [K in keyof R]: Static; }; type TupleStatic = FlattenSplitAtSpread extends infer X ? X extends Lrt ? R extends Runtype.Core ? [...MapStatic, ...Static, ...MapStatic] : [...MapStatic, ...MapStatic] : never : never; type ToReadonlyImpl = A extends [ infer A0, ...infer A ] ? ToReadonlyImpl : B; type ToReadonly = ToReadonlyImpl; /** * Validates that a value is an array of the given element types. * * Possible failures: * * - `TYPE_INCORRECT` for non-arrays * - `CONSTRAINT_FAILED` with `thrown` being a string reporting that the length constraint was not fulfilled * - `CONTENT_INCORRECT` with `details` reporting the failed elements */ interface Tuple extends Runtype, TupleParsed>, Iterable>> { tag: "tuple"; readonly components: Tuple.Components extends infer X ? { [K in keyof X]: X[K]; } : never; asReadonly: () => Tuple.Readonly; } declare namespace Tuple { type Components = FlattenSplitAtSpread extends infer X ? X extends Lrt ? unknown extends R ? [...L, ...T] : X : never : never; interface Readonly extends Runtype>, ToReadonly>>, Iterable>> { tag: "tuple"; readonly components: Tuple.Components extends infer X ? { [K in keyof X]: X[K]; } : never; } namespace Components { type Fixed = [R] extends [never] ? readonly Runtype[] : Components; type Variadic = [R] extends [never] ? Lrt : Components; } } declare const Tuple: (...components: R) => Tuple; export default Tuple;