import { type Closure, type AsyncClosure, Ok, Err, Unsafe } from "@"; type Array$0 = Array; /** * ***Brief*** * A wrapper that encapsulates either a successful outcome `Ok` or a failure `Err`. * * ***Example*** * ```ts * function foo(): Result<200n, 404n> { * if () return Ok(200n); * return Err(404n); * } * * let result: Result<200n, 404n> = foo(); * if (result.ok()) { * let value: 200n = result.unlock(); * /// ... * } * ``` */ export type Result = Ok | Err; export namespace Result { export type Async = Promise>; export type Array = Array$0>; export type Handler = { /** * ***Brief*** * Iterates through an array of `Result`, short-circuiting at the first `Err`. * * ***Example*** * ```ts * let r0: Result<200n, 404n>; * let r1: Result<201n, 405n>; * let r2: Result<202n, 406n>; * let r: Result<[200n, 201n, 202n], 404n | 405n | 406n> = Result.all([r0, r1, r2]); * ``` */ all>(results: T1): Result, Err.ValFromAll[number]>; /** * ***Brief*** * Iterates through an array of `Result`, short-circuiting at the first `Ok`. * * ***Example*** * ```ts * let r0: Result<200n, 404n>; * let r1: Result<201n, 405n>; * let r2: Result<202n, 406n>; * let r: Result<200n | 201n | 202n, [404n, 405n, 406n]> = Result.any([r0, r1, r2]); * ``` */ any>(results: T1): Result[number], Err.ValFromAll>; /** * ***Brief*** * Wraps an unsafe operation that might throw an error and returns a `Result`. * * ***Example*** * ```ts * await Result.wrap(() => { * /// Some unsafe task. * /// ... * return 200n; * }).mapErr(unsafe => { * unsafe * .parse((unknown): unknown is string => { * return typeof unknown is "string"; * }) * .map(string => { * /// ... * }); * return 200n; * }); * ``` */ wrap>(task: Closure, ...payload: T3): Result; /** * ***Brief*** * Wraps an asynchronous unsafe operation that may throw and returns a `Result`. * * * ***Example*** * ```ts * await Result.wrapAsync(async () => { * /// Some unsafe async task. * /// ... * return 200n; * }).mapErr(unsafe => { * unsafe * .parse((unknown): unknown is string => { * return typeof unknown is "string"; * }) * .map(string => { * /// ... * }); * return 200n; * }); * ``` */ wrapAsync>(task: AsyncClosure, ...payload: T3): Promise>; }; export const Handler: Handler = (() => { /** @constructor */ { return { all, any, wrap, wrapAsync }; } function all>(results: T1): Result, Err.ValFromAll[number]> { let out: Array$0 = []; let i: number = 0; while (i < results.length) { let result: Result = results.at(i)!; if (result.ok()) out.push(result.unwrap()); else return result as Err[number]>; i ++; } return Ok((out as Ok.ValFromAll)); } function any>(results: T1): Result[number], Err.ValFromAll> { let out: Array$0 = []; let i: number = 0; while (i < results.length) { let wrapper: Result = results.at(i)!; if (wrapper.ok()) return wrapper as Ok[number]>; else out.push(wrapper.inspect()); i ++; } return Err((out as Err.ValFromAll)); } function wrap>(task: Closure, ...payload: T3): Result { try { return Ok(task(...payload)); } catch (e) { return Err(Unsafe(e)); } } async function wrapAsync>(task: AsyncClosure, ...payload: T3): Promise> { try { return Ok((await task(...payload))); } catch (e) { return Err(Unsafe(e)); } } })(); }