import { type Closure, type Option, type Result, type Function as Function$0, Error, Err, Some, } from "@"; export type Ok = { /** * ***Brief*** * `ok` checks if the current instance is `Ok`. * * ***Example*** * ```ts * let result: Result<200n, 404n>; * if (result.ok()) { * let value: 200n = result.unlock(); * /// ... * } * ``` */ ok(): this is Ok; /** * ***Brief*** * `err` checks if the current instance is `Err`. * * ***Example*** * ```ts * let result: Result<200n, 404n>; * if (result.err()) { * let e: 404n = result.inspect(); * /// ... * } * ``` */ err(): this is Err; /** * ***Brief*** * `expect` terminates with `panic` if the `Result` is `Err`. * * ***Warning*** * Reserved for debugging or unrecoverable errors. * * ***Example*** * ```ts * let result: Result<200n, 404n>; * let status: 200n = result.expect("This is unexpected and unrecoverable."); * ``` */ expect(): T1; expect(__: unknown): T1; expect(__?: unknown): T1; /** * ***Brief*** * Ensures that the `Result` is an `Err` and retrieves the error value inside. * * ***Warning*** * Reserved for debugging or unrecoverable errors. * * ***Example*** * ```ts * let result: Result<200n, 404n>; * let status: 404n = result.expectErr("This is unexpected and unrecoverable."); * ``` */ expectErr(): never; expectErr(message: string): never; expectErr(message?: string): never; /** * ***Brief*** * Unwraps the wrapped value of type `T1`. * * ***Requirement*** * Does not `panic`. * * ***Example*** * ```ts * let unsafe: Unsafe = Unsafe(500n); * unsafe.unwrap(); * ``` */ unwrap(): T1; /** * ***Brief*** * Retrieves the value of an `Ok`, or falls back to the provided value if it’s an `Err`. * * ***Example*** * ```ts * let result: Result<200n, 404n> = Err(404n); * let status: 200n = result.unwrapOr(200n); * console.log(status); /// 200n. * ``` */ unwrapOr(__: unknown): T1; /** * ***Brief*** * Recovers from the current error by applying a recovery function, transforming the `Err` into an `Ok`. * * ***Example*** * ```ts * let result: Result<200n, 404n> = Err(404n); * let status: 200n = result * .recover(() => { * return 200n; * }) * .unlock(); * ``` */ recover(__: unknown): Ok; /** * ***Brief*** * Applies a transformation to the `Ok` value and returns an `Err` instance with the transformed value. * * ***Example*** * ```ts * let result: Result<200n, 404n> = Ok(200n); * let e: 404n = result * .degrade(() => { * return 404n; * }) * .inspect(); * console.log(e); /// 404n. * ``` */ degrade(task: Function$0): Err; /** * ***Brief*** * Chains an task until the first `Err` is encountered. * * ***Example*** * ```ts * let result: Result<200n, 404n> = Err(404n); * result * .and(value => { * /// Task is skipped because `Result` is an `Err`. * /// ... * return Ok(value + 1n); * }) * .and(value => { * /// Task is skipped because `Result` is an `Err`. * /// ... * }); * ``` */ and(task: Closure<[T1], Ok>): Ok; and(task: Closure<[T1], Err>): Result; and(task: Closure<[T1], Result>): Result; /** * ***Brief*** * Transforms the `Ok` value if present, but if this is already an `Err`, it remains unchanged. * * ***Example*** * ```ts * let result0: Result<200n, 404n> = Ok(200n); * let result1: Result<201n, 404n> = result.map(value => { * /// Task is run because `Result` is `Ok`. * /// ... * return value + 1n; * }); * ``` */ map(task: Closure<[T1], T2>): Ok; /** * ***Brief*** * Transforms the error contained in the `Err` using the provided `task` function. * * ***Example*** * ```ts * let result: Result<200n, 404n> = Err(404n); * result * .mapErr(e => { * return e + 1n; * }) * .inspect(); /// 405n. * ``` * * ***Example*** * ```ts * let result: Result<200n, 404n> = Ok(200n); * result * .mapErr(e => { * /// Task is run because `Result` is `Ok`. * /// ... * }); * ``` */ mapErr(__: unknown): Ok; /** * ***Brief*** * Converts a `Result` to an `Option`. * * ***Example*** * ```ts * let result: Result<200n, 404n>; * let option: Option<200n> = result.toOption(); * ``` */ toOption(): Option; }; /** * ***Brief*** * The successful value within a `Result`. */ export function Ok(_value: T1): Ok { let _this: Ok; /** @constructor */ { return _this = { ok, err, expect, expectErr, unwrap, unwrapOr, and, map, mapErr, recover, degrade, toOption }; } function ok(): this is Ok { return true; } function err(): this is Err { return false; } function expect(): T1; function expect(__: unknown): T1; function expect(__?: unknown): T1 { return unwrap(); } function expectErr(): never; function expectErr(message: string): never; function expectErr(message?: string): never { Error.Handler.panic(Error("PANIC", message)); } function unwrap(): T1 { return _value; } function unwrapOr(__: unknown): T1 { return unwrap(); } function and(task: Closure<[T1], Ok>): Ok; function and(task: Closure<[T1], Err>): Result; function and(task: Closure<[T1], Result>): Result; function and(task: Closure<[T1], Result>): Result { return task(unwrap()); } function map(task: Closure<[T1], T2>): Ok { return Ok(task(unwrap())); } function mapErr(__: unknown): Ok { return _this; } function recover(__: unknown): Ok { return _this; } function degrade(task: Closure<[T1], T2>): Err { return Err(task(unwrap())); } function toOption(): Option { return Some(unwrap()); } } export namespace Ok { export type From> = T1 extends Ok ? Ok : never; export type FromAll>> = { [T2 in keyof T1]: T1[T2] extends Ok ? From : never; }; export type ValFrom> = T1 extends Ok ? T2 : never; export type ValFromAll>> = { [T2 in keyof T1]: ValFrom; }; }