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] } // eslint-disable-next-line @typescript-eslint/no-unused-vars 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] } } // eslint-disable-next-line @typescript-eslint/no-unused-vars 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 }