import { ElemType, Eq, Prec } from './utils.js'; export interface HKT { 0: unknown; 1: unknown; } export type Apply = (F & { 1: A; })[0]; export interface Compose extends HKT { 0: Apply>; } export interface HKT2 { 0: unknown; 1: unknown; 2: unknown; } export type Apply2 = (F & { 1: A; 2: B; })[0]; export interface Id extends HKT { 0: this[1]; } export interface ExpectedIndexedArray<_T> { readonly _: unique symbol; } export interface Index extends HKT { 0: this[1] extends [number, infer T][] ? T[] : ExpectedIndexedArray; } export interface Const extends HKT { 0: A; } export interface Optional extends HKT { 0: this[1] | undefined; } export interface Union extends HKT { 0: A | this[1]; } export interface Elems extends HKT { 0: Array; } export interface ElemUnion extends HKT { 0: Array | this[1]>; } export interface Prop extends HKT { 0: Omit & { [KK in K]: this[1]; }; } export type SetTuplePath = K extends [] ? Id : K extends [infer K, ...infer R] ? K extends keyof S ? Compose, SetTuplePath> : never : never; export type SetDottedPath = K extends `${infer P}.${infer R}` ? P extends keyof S ? Compose, SetDottedPath> : never : K extends keyof S ? Prop : K extends '' ? Id : never; type SetNthRec = N extends 0 ? S extends [any, ...infer U] ? [B, ...U] : never : S extends [infer U, ...infer V] ? [U, ...SetNthRec, B, V>] : never; export interface SetNth extends HKT { 0: SetNthRec; } export interface Plant extends HKT { 0: Omit & { [KK in keyof this[1]]: this[1][KK]; }; } export interface PartsOf extends HKT { 0: Apply>; } interface DisallowedTypeChange { readonly _: unique symbol; } export interface Choice extends HKT { 0: Eq extends true ? A : DisallowedTypeChange; } export interface Adapt extends HKT { 0: Eq extends true ? A : DisallowedTypeChange; } export interface DisallowTypeChange extends HKT { 0: this[1] extends T ? T : DisallowedTypeChange; } export {};