UNPKG

rivo

Version:

🤖 The ultimate library you need for composable type-level programming in TypeScript, powered by HKT.

31 lines (25 loc) • 900 B
import type { Args, Fn } from "../HKT"; import type { List } from "../List"; import type { Assert, Cast } from "../helpers"; type _ToList<U, LN extends List = [], LastU = Last<U>> = { 0: _ToList<Exclude<U, LastU>, [LastU, ...LN]>; 1: LN; }[[U] extends [never] ? 1 : 0]; type Last<U> = IntersectOf<U extends unknown ? (x: U) => void : never> extends (x: infer P) => void ? P : never; type IntersectOf<U> = (U extends unknown ? (k: U) => void : never) extends (k: infer I) => void ? I : never; /** * Convert a union type to a `List`. * * Sig: `<T>(u: UnionOf<T>) => List<T>` */ export type ToList<U> = Assert<List<unknown>, _ToList<U> extends infer X ? Cast<X, List> : never>; /** * [Fn] Convert a union type to a `List`. * * Sig: `<T>(u: UnionOf<T>) => List<T>` */ export default interface ToListFn extends Fn<[unknown], unknown> { def: ([u]: Args<this>) => ToList<typeof u>; }