UNPKG

rivo

Version:

🤖 The ultimate library you need for composable type-level programming in TypeScript, powered by HKT.

83 lines (75 loc) • 2.05 kB
import type { Option } from "."; import type { Args, Fn, GenericFn, GenericResolver } from "../HKT"; import type { AssertBool, IsNever, Lazied, Lazied$Get } from "../helpers"; /** * A type that represents a value that exists (compared to {@link None}). */ export interface Some<T> { readonly _tag: "Some"; readonly value: T; } /** * {@link Lazied} version of {@link Some}. */ export interface SomeL<L extends Lazied> extends Some<Lazied$Get<L>> {} /** * A type that represents a value that does not exist (compared to {@link Some}). */ export interface None { readonly _tag: "None"; } /** * Wrap a value in a {@link Some}. * * Sig: `<T>(value: T) => Some<T>` */ export type OfSome<T> = Some<T>; interface OfSomeFnResolver extends GenericResolver<[unknown], Some<unknown>> { on1: ([x]: Args<this>) => [[], Some<typeof x>]; } /** * [Fn] Wrap a value in a {@link Some}. * * Sig: `<T>(value: T) => Some<T>` */ export interface OfSomeFn extends GenericFn<OfSomeFnResolver> { def: ([o]: Args<this>) => OfSome<typeof o>; } /** * Check if an {@link Option} is {@link Some}. * * Sig: `(o: Option<unknown>) => boolean` */ export type IsSome<O extends Option<unknown>> = AssertBool< IsNever<O> extends true ? never : O["_tag"] extends "Some" ? true : O["_tag"] extends "None" ? false : boolean >; /** * [Fn] Check if an {@link Option} is {@link Some}. * * Sig: `(o: Option<unknown>) => boolean` */ export interface IsSomeFn extends Fn<[Option<unknown>], boolean> { def: ([o]: Args<this>) => IsSome<typeof o>; } /** * Check if an {@link Option} is {@link None}. * * Sig: `(o: Option<unknown>) => boolean` */ export type IsNone<O extends Option<unknown>> = AssertBool< IsNever<O> extends true ? never : O["_tag"] extends "None" ? true : O["_tag"] extends "Some" ? false : boolean >; /** * [Fn] Check if an {@link Option} is {@link None}. * * Sig: `(o: Option<unknown>) => boolean` */ export interface IsNoneFn extends Fn<[Option<unknown>], boolean> { def: ([o]: Args<this>) => IsNone<typeof o>; }