UNPKG

rivo

Version:

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

32 lines (28 loc) • 1.1 kB
import type { List } from "."; import type { Args, GenericFn, GenericResolver } from "../HKT"; /** * Flatten a {@link List} of {@link List}s into a single {@link List}. * * Sig: `<T>(xs: List<List<T>>) => List<T>` */ export type Flatten<TS extends List<List>> = TS extends unknown[] ? _FlattenWritable<TS> : _FlattenReadonly<TS>; type _FlattenReadonly<TS extends List<List>> = TS extends readonly [infer Head extends List, ...infer Tail extends List<List>] ? readonly [...Head, ..._FlattenReadonly<Tail>] : readonly []; type _FlattenWritable<TS extends List<List>> = TS extends readonly [infer Head extends List, ...infer Tail extends List<List>] ? [...Head, ..._FlattenWritable<Tail>] : []; interface Resolver extends GenericResolver<[List<List>], List> { on1: ([xs]: Args<this>) => [[], List<(typeof xs)[number][number]>]; } /** * [Fn] Flatten a {@link List} of {@link List}s into a single {@link List}. * * Sig: `<T>(xs: List<List<T>>) => List<T>` */ export default interface FlattenFn extends GenericFn<Resolver> { def: ([xs]: Args<this>) => Flatten<typeof xs>; }