import type { TypeError } from '@traversable/registry' import type * as t from './schema.js' export type Target = S extends Guard ? T : S extends Predicate ? T : never export type $ = [keyof S] extends [never] ? unknown : S export interface Predicate { (value: T): boolean (value?: T): boolean } export type InvalidItem = never | TypeError<'A required element cannot follow an optional element.'> export type Guard = { (u: unknown): u is T } export interface Typeguard { (u: unknown): u is this['_type']; readonly _type: T } export type { TypePredicate_ as TypePredicate } type TypePredicate_ = never | TypePredicate<[I, O]> interface TypePredicate { (u: T[0]): u is T[1] (u: T[1]): boolean } export type ValidateTuple< T extends readonly unknown[], LowerBound = t.optional, V = ValidateOptionals<[...T], LowerBound>, > = [V] extends [['ok']] ? T : V export type ValidateOptionals, Acc extends unknown[] = []> = LowerBound extends S[number] ? S extends [infer H, ...infer T] ? LowerBound extends H ? T[number] extends LowerBound ? ['ok'] : [...Acc, H, ...{ [Ix in keyof T]: T[Ix] extends LowerBound ? T[Ix] : InvalidItem }] : ValidateOptionals : ['ok'] : ['ok']