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