rivo
Version:
🤖 The ultimate library you need for composable type-level programming in TypeScript, powered by HKT.
25 lines (21 loc) • 896 B
TypeScript
import type { None, Option, Some } from ".";
import type { Args, GenericFn, GenericResolver } from "..";
/**
* Flatten an {@link Option} of an {@link Option} into an {@link Option}.
*
* Sig: `<T>(o: Option<Option<T>>) => Option<T>`
*/
export type Flatten<O extends Option<Option<unknown>>> =
O extends Some<infer O extends Option<unknown>> ? O : None;
interface Resolver extends GenericResolver<[Option<Option<unknown>>], Option<unknown>> {
on1: ([o]: Args<this>) => [[], typeof o extends Option<Option<infer T>> ? Option<T> : never];
on_r: ([, r]: Args<this>) => [Option<Option<typeof r extends Option<infer T> ? T : never>>];
}
/**
* [Fn] Flatten an {@link Option} of an {@link Option} into an {@link Option}.
*
* Sig: `<T>(o: Option<Option<T>>) => Option<T>`
*/
export default interface FlattenFn extends GenericFn<Resolver> {
def: ([o]: Args<this>) => Flatten<typeof o>;
}