rivo
Version:
🤖 The ultimate library you need for composable type-level programming in TypeScript, powered by HKT.
31 lines (27 loc) • 1.13 kB
TypeScript
import type { Option, Some } from ".";
import type { Args, GenericFn, GenericResolver } from "../HKT";
import type { AssertUnknown, Broaden } from "../helpers";
/**
* Get the inner value of an {@link Option} if it is {@link Some}, otherwise return `Default`.
*
* Sig: `<T>(default: T, o: Option<T>) => T`
*/
export type UnwrapOr<Default, O extends Option<unknown>> = AssertUnknown<
O extends Some<infer T> ? T : Default
>;
interface Resolver extends GenericResolver<[unknown, Option<unknown>], unknown> {
on1_: ([d]: Args<this>) => [[Option<Broaden<typeof d>>], Broaden<typeof d>];
on_1: ([, o]: Args<this>) => [
[Option<typeof o extends Option<infer T> ? T : never>],
typeof o extends Option<infer T> ? T : never,
];
on11: ([d, o]: Args<this>) => [[], (typeof o extends Option<infer T> ? T : never) | typeof d];
}
/**
* [Fn] Get the inner value of an {@link Option} if it is {@link Some}, otherwise return `default`.
*
* Sig: `<T>(default: T, o: Option<T>) => T`
*/
export default interface UnwrapOrFn extends GenericFn<Resolver> {
def: ([d, o]: Args<this>) => UnwrapOr<typeof d, typeof o>;
}