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