rivo
Version:
🤖 The ultimate library you need for composable type-level programming in TypeScript, powered by HKT.
31 lines (25 loc) • 900 B
TypeScript
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>;
}