import type { Result } from "."; import type { Arg0, Args, Fn, GenericFn, GenericResolver } from "../HKT"; import type { AssertBool, IsNever, Lazied, Lazied$Get } from "../helpers"; export interface Ok { readonly _tag: "Ok"; readonly ok: T; } export interface OkL extends Ok> {} export interface Err { readonly _tag: "Err"; readonly err: E; } export interface ErrL extends Err> {} /** * Wrap a value in an {@link Ok}. * * Sig: `(value: T) => Ok` * * @example * ```typescript * type R = OfOk<42>; * // ^?: Ok<42> * ``` */ export type OfOk = Ok; interface OfOkResolver extends GenericResolver<[unknown], Ok> { on1: ([o]: Args) => [[], Ok]; } /** * [Fn] Wrap a value in an {@link Ok}. * * Sig: `(value: T) => Ok` */ export interface OfOkFn extends GenericFn { def: () => OfOk>; } /** * Check if a {@link Result} is {@link Ok}. */ export type IsOk> = AssertBool< IsNever extends true ? never : R["_tag"] extends "Ok" ? true : R["_tag"] extends "Err" ? false : boolean >; /** * [Fn] Check if a {@link Result} is {@link Ok}. */ export interface IsOkFn extends Fn<[Result], boolean> { def: ([value]: Args) => IsOk; } /** * Wrap a value in an {@link Err}. * * Sig: `(err: E) => Err` * * @example * ```typescript * type R = OfErr<"Something went wrong">; * // ^?: Err<"Something went wrong"> * ``` */ export type OfErr = Err; interface OfErrResolver extends GenericResolver<[unknown], Err> { on1: ([err]: Args) => [[], Err]; } /** * [Fn] Wrap a value in an {@link Err}. * * Sig: `(err: E) => Err` */ export interface OfErrFn extends GenericFn { def: () => OfErr>; } /** * Check if a {@link Result} is {@link Err}. */ export type IsErr> = AssertBool< IsNever extends true ? never : R["_tag"] extends "Err" ? true : R["_tag"] extends "Ok" ? false : boolean >; /** * [Fn] Check if a {@link Result} is {@link Err}. */ export interface IsErrFn extends Fn<[Result], boolean> { def: ([r]: Args) => IsErr; }