rivo
Version:
🤖 The ultimate library you need for composable type-level programming in TypeScript, powered by HKT.
30 lines (26 loc) • 1.1 kB
TypeScript
import type { None, Option, Some } from ".";
import type { Args, Call1, Fn1, GenericFn, GenericResolver, Param0, Return } from "../HKT";
/**
* Apply a function to an {@link Option} value if it is {@link Some}, otherwise return {@link None}.
*
* Sig: `<T, U>(f: (x: T) => U, o: Option<T>) => Option<U>`
*/
export type Map<F extends Fn1, O extends Option<unknown>> =
O extends Some<infer T extends Param0<F>> ? Some<Call1<F, T>> : None;
interface Resolver extends GenericResolver<[Fn1, Option<unknown>], Option<unknown>> {
on1_: ([f]: Args<this>) => [[Option<Param0<typeof f>>], Option<Return<typeof f>>];
on_1: ([, o]: Args<this>) => [
[Fn1<typeof o extends Option<infer T> ? T : never>],
Option<unknown>,
];
on11: ([f, o]: Args<this>) => [[], Option<Return<typeof f>>];
}
/**
* [Fn] Apply a function to an {@link Option} value if it is {@link Some}, otherwise return
* {@link None}.
*
* Sig: `<T, U>(f: (x: T) => U, o: Option<T>) => Option<U>`
*/
export default interface MapFn extends GenericFn<Resolver> {
def: ([f, o]: Args<this>) => Map<typeof f, typeof o>;
}