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: `(xs: List>) => List` */ export type Flatten> = TS extends unknown[] ? _FlattenWritable : _FlattenReadonly; type _FlattenReadonly> = TS extends readonly [infer Head extends List, ...infer Tail extends List] ? readonly [...Head, ..._FlattenReadonly] : readonly []; type _FlattenWritable> = TS extends readonly [infer Head extends List, ...infer Tail extends List] ? [...Head, ..._FlattenWritable] : []; interface Resolver extends GenericResolver<[List], List> { on1: ([xs]: Args) => [[], List<(typeof xs)[number][number]>]; } /** * [Fn] Flatten a {@link List} of {@link List}s into a single {@link List}. * * Sig: `(xs: List>) => List` */ export default interface FlattenFn extends GenericFn { def: ([xs]: Args) => Flatten; }