import type { Call1W, Fn1, Return } from "../HKT"; import type { ValueOf } from "../Obj/ValueOf"; import type { Eq, Lazied, Lazied$Get } from "../helpers"; export type HKT = Lazied$Get; /** * {@link Lazied} version of {@link HKT}. */ export type HKTL = Lazied>; /** * Registry of HKT builders and extractors. * * Only HKT with **1** type parameter is supported. * * GADT is _not_ supported, i.e., the type builder must accept any type as its type parameter * (should match `Fn1`, not something like `Fn1`). */ export interface HKTRegistry {} /** * Helper type for registering {@link HKT} builders and extractors. */ export type RegisterHKT< Builder extends Fn1, Extractor extends Fn1, unknown>, > = [Builder, Extractor]; /** * Build an {@link HKT} from a type parameter. */ export type Kind = HKT$GetBuilder & { readonly Args: (_: [A]) => void } extends ( { readonly def: (...args: never[]) => infer R } ) ? R : never; /** * Get the matching entry of {@link HKT} for `H`. * @private */ type _HKT$GetMatch = ValueOf<{ [P in keyof HKTRegistry as H extends Return ? P : never]: HKTRegistry[P]; }>; /** * Get the builder of `H` from {@link HKTRegistry}. */ export type HKT$GetBuilder = _HKT$GetMatch extends [infer Builder extends Fn1, unknown] ? Builder : never; /** * The **unsafe** version of {@link HKT$GetBuilder} (i.e. no type checking with `H`). */ export type HKT$GetBuilderW = H extends HKT ? HKT$GetBuilder : never; /** * Get the extractor of `H` from {@link HKTRegistry}. */ export type HKT$GetExtractor = _HKT$GetMatch extends [unknown, infer Extractor extends Fn1] ? Extractor : never; /** * The **unsafe** version of {@link HKT$GetExtractor} (i.e. no type checking with `H`). */ export type HKT$GetExtractorW = H extends HKT ? HKT$GetExtractor : never; /** * Extract the type parameter of `H`. */ export type HKT$Extract = Call1W, H>; /** * The **unsafe** version of {@link HKT$Extract} (i.e. no type checking with `H`). */ export type HKT$ExtractW = H extends HKT ? HKT$Extract : never; /** * Mutate the type parameter of `H`. */ export type HKT$Mutate = Call1W, T>; /** * The **unsafe** version of {@link HKT$Mutate} (i.e. no type checking with `H`). */ export type HKT$MutateW = H extends HKT ? HKT$Mutate : never; /** * Get the construct of `H` from {@link HKTRegistry}. */ export type HKT$GetConstruct = Eq extends true ? H : _HKT$GetMatch extends [infer Builder extends Fn1, unknown] ? Return : never; /** * The **unsafe** version of {@link HKT$GetConstruct} (i.e. no type checking with `H`). */ export type HKT$GetConstructW = H extends HKT ? HKT$GetConstruct : never;