commit 1fbc9fb00f7aa1b4e2caec511af2da43c1168994 Author: Robin Chappatte Date: Tue May 21 15:56:54 2024 +0200 initial commit diff --git a/lib.ts b/lib.ts new file mode 100644 index 0000000..a618788 --- /dev/null +++ b/lib.ts @@ -0,0 +1,56 @@ +interface ResultInterface { + unwrap: () => T | E; + readonly success: boolean; +} + +export class ResultSuccess implements ResultInterface { + data: T; + readonly success = true; + + constructor(data: T) { + this.data = data; + } + + unwrap(): T { + return this.data; + } +} + +export class ResultError implements ResultInterface { + error: E; + readonly success = false; + + constructor(error: E) { + this.error = error; + } + + unwrap(): E { + return this.error; + } +} + +export type Result = ResultSuccess | ResultError; + +export function ok(value?: T): ResultSuccess; +export function ok(value: T) { + return new ResultSuccess(value); +} + +export function fail(error?: T): ResultError; +export function fail(error: T) { + return new ResultError(error); +} + +export function fromPromise( + promise: Promise, +): Promise> { + return promise.then(ok).catch(fail); +} + +export function catchThrow(func: () => T): Result { + try { + return ok(func()); + } catch (error) { + return fail(error); + } +} diff --git a/mod.ts b/mod.ts new file mode 100644 index 0000000..5fcd5f7 --- /dev/null +++ b/mod.ts @@ -0,0 +1 @@ +export * from "./lib.ts";