UNPKG

@hazae41/result

Version:

Rust-like Result for TypeScript

1 lines 12.9 kB
{"version":3,"file":"result.cjs","sources":["../../../../src/mods/result/result.ts"],"sourcesContent":["import { Nullable } from \"@hazae41/option\"\nimport { Awaitable } from \"libs/promises/promises.js\"\nimport { Err } from \"./err.js\"\nimport { Catched } from \"./errors.js\"\nimport { Ok } from \"./ok.js\"\n\nexport interface Unwrappable<T = unknown> {\n getOrThrow(): T\n}\n\n/**\n * An object that can be either an Ok or an Err\n */\nexport type Result<T = unknown, E = unknown> =\n | Ok<T>\n | Err<E>\n\n/**\n * A result whose Ok type is the same as its Err type\n * @example An `update<T>(): Fallback<T>` will return `Ok<T>` if an update was found and `Err<T>` if not\n */\nexport type Fallback<T> = Result<T, T>\n\nexport namespace Result {\n\n export type Infer<T> =\n | Ok.Infer<T>\n | Err.Infer<T>\n\n /**\n * Create a Result from a maybe Error value\n * @param inner \n * @returns `Ok<T>` if `T`, `Err<Error>` if `Error`\n */\n export function from<T>(inner: T | Error) {\n if (inner instanceof Error)\n return new Err(inner)\n else\n return new Ok(inner)\n }\n\n /**\n * Create a Result from a boolean\n * @param value \n * @returns \n */\n export function assert(value: boolean) {\n return value ? Ok.void() : Err.void()\n }\n\n /**\n * Rewrap any type that extends Ok into an Ok\n * @param wrapper \n */\n export function rewrap<T extends Ok.Infer<T>>(wrapper: T): Ok<Ok.Inner<T>>\n\n /**\n * Rewrap any type that extends Err into an Err\n * @param wrapper \n */\n export function rewrap<T extends Err.Infer<T>>(wrapper: T): Err<Err.Inner<T>>\n\n /**\n * Rewrap any type that extends Result into a Result\n * @param wrapper \n */\n export function rewrap<T extends Result.Infer<T>>(wrapper: T): Result<Ok.Inner<T>, Err.Inner<T>>\n\n /**\n * Rewrap any object with getOrThrow() into a Result\n * @param wrapper \n */\n export function rewrap<T, E>(wrapper: Unwrappable<T>): Result<T, E>\n\n export function rewrap<T, E>(wrapper: Unwrappable<T>) {\n try {\n return new Ok(wrapper.getOrThrow())\n } catch (error: unknown) {\n return new Err(error as E)\n }\n }\n\n /**\n * Catch an Err thrown from Err.throw\n * @param callback \n * @param type \n * @returns `Ok<T>` if no `Err` was thrown, `Err<E>` otherwise\n * @see Err.throw\n */\n export async function unthrow<R extends Result.Infer<R>>(callback: (thrower: (e: Err.Infer<R>) => void) => Awaitable<R>): Promise<R> {\n let ref: Err.Infer<R> | undefined\n\n try {\n return await callback((e: Err.Infer<R>) => ref = e)\n } catch (e: unknown) {\n if (ref !== undefined)\n return ref as R\n throw e\n }\n }\n\n /**\n * Catch an Err thrown from Err.throw\n * @param callback \n * @param type \n * @returns `Ok<T>` if no `Err` was thrown, `Err<E>` otherwise\n * @see Err.throw\n */\n export function unthrowSync<R extends Result.Infer<R>>(callback: (thrower: (e: Err.Infer<R>) => void) => R): R {\n let ref: Err.Infer<R> | undefined\n\n try {\n return callback((e: Err.Infer<R>) => ref = e)\n } catch (e: unknown) {\n if (ref !== undefined)\n return ref as R\n throw e\n }\n }\n\n /**\n * Run a callback and wrap any returned value in Ok<T> and any thrown error in Err<unknown>\n * @param callback \n * @returns \n */\n export async function runAndWrap<T>(callback: () => Awaitable<T>): Promise<Result<T, unknown>> {\n try {\n return new Ok(await callback())\n } catch (e: unknown) {\n return new Err(e)\n }\n }\n\n /**\n * Run a callback and wrap any returned value in Ok<T> and any thrown error in Err<unknown>\n * @param callback \n * @returns \n */\n export function runAndWrapSync<T>(callback: () => T): Result<T, unknown> {\n try {\n return new Ok(callback())\n } catch (e: unknown) {\n return new Err(e)\n }\n }\n\n /**\n * Run a callback and wrap any returned value in Ok<T> and any thrown error in Err<Catched>\n * @param callback \n * @returns \n */\n export async function runAndDoubleWrap<T>(callback: () => Awaitable<T>): Promise<Result<T, Error>> {\n try {\n return new Ok(await callback())\n } catch (e: unknown) {\n return new Err(Catched.wrap(e))\n }\n }\n\n /**\n * Run a callback and wrap any returned value in Ok<T> and any thrown error in Err<Catched>\n * @param callback \n * @returns \n */\n export function runAndDoubleWrapSync<T>(callback: () => T): Result<T, Error> {\n try {\n return new Ok(callback())\n } catch (e: unknown) {\n return new Err(Catched.wrap(e))\n }\n }\n\n /**\n * Run a callback and wrap any thrown error in Err<unknown>\n * @param callback \n * @returns \n */\n export async function runOrWrap<R extends Result.Infer<R>>(callback: () => Awaitable<R>): Promise<R | Err<unknown>> {\n try {\n return await callback()\n } catch (e: unknown) {\n return new Err(e)\n }\n }\n\n /**\n * Run a callback and wrap any thrown error in Err<unknown>\n * @param callback \n * @returns \n */\n export function runOrWrapSync<R extends Result.Infer<R>>(callback: () => R): R | Err<unknown> {\n try {\n return callback()\n } catch (e: unknown) {\n return new Err(e)\n }\n }\n\n /**\n * Run a callback and wrap any thrown error in Err<unknown>\n * @param callback \n * @returns \n */\n export async function runOrDoubleWrap<R extends Result.Infer<R>>(callback: () => Awaitable<R>): Promise<R | Err<Error>> {\n try {\n return await callback()\n } catch (e: unknown) {\n return new Err(Catched.wrap(e))\n }\n }\n\n /**\n * Run a callback and wrap any thrown error in Err<unknown>\n * @param callback \n * @returns \n */\n export function runOrDoubleWrapSync<R extends Result.Infer<R>>(callback: () => R): R | Err<Error> {\n try {\n return callback()\n } catch (e: unknown) {\n return new Err(Catched.wrap(e))\n }\n }\n\n /**\n * Transform `Iterable<Result<T,E>` into `Result<Array<T>, E>`\n * @param iterable \n * @returns `Result<Array<T>, E>`\n */\n export function all<T, E>(iterable: Iterable<Result<T, E>>): Result<Array<T>, E> {\n return collect(iterate(iterable))\n }\n\n export function maybeAll<T, E>(iterable: Iterable<Nullable<Result<T, E>>>): Nullable<Result<Array<T>, E>> {\n return maybeCollect(maybeIterate(iterable))\n }\n\n /**\n * Transform `Iterable<Result<T,E>` into `Iterator<T, Result<void, E>>`\n * @param iterable \n * @returns `Iterator<T, Result<void, E>>`\n */\n export function* iterate<T, E>(iterable: Iterable<Result<T, E>>): Iterator<T, Result<void, E>> {\n for (const result of iterable) {\n if (result.isOk())\n yield result.get()\n else\n return result\n }\n\n return Ok.void()\n }\n\n export function* maybeIterate<T, E>(iterable: Iterable<Nullable<Result<T, E>>>): Iterator<T, Nullable<Result<void, E>>> {\n for (const result of iterable) {\n if (result == null)\n return result\n else if (result.isOk())\n yield result.get()\n else\n return result\n }\n\n return Ok.void()\n }\n\n /**\n * Transform `Iterator<T, Result<void, E>>` into `Result<Array<T>, E>`\n * @param iterator `Result<Array<T>, E>`\n */\n export function collect<T, E>(iterator: Iterator<T, Result<void, E>>): Result<Array<T>, E> {\n const array = new Array<T>()\n\n let result = iterator.next()\n\n for (; !result.done; result = iterator.next())\n array.push(result.value)\n\n return result.value.set(array)\n }\n\n export function maybeCollect<T, E>(iterator: Iterator<T, Nullable<Result<void, E>>>): Nullable<Result<Array<T>, E>> {\n const array = new Array<T>()\n\n let result = iterator.next()\n\n for (; !result.done; result = iterator.next())\n array.push(result.value)\n\n if (result.value == null)\n return\n\n return result.value.set(array)\n }\n\n}"],"names":["Result","Err","Ok","Catched"],"mappings":"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"}