From 1536fe1c504bdbbaebef83697701406652bc1ec5 Mon Sep 17 00:00:00 2001 From: Rune Harlyk Date: Thu, 22 Feb 2024 23:03:30 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=A8=20Adds=20result=20types=20-=20Resu?= =?UTF-8?q?lt,=20Error=20&=20Ok?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/lib/utilities/result.ts | 22 ---------------- app/src/lib/utilities/result/err.ts | 36 ++++++++++++++++++++++++++ app/src/lib/utilities/result/index.ts | 3 +++ app/src/lib/utilities/result/ok.ts | 36 ++++++++++++++++++++++++++ app/src/lib/utilities/result/result.ts | 20 ++++++++++++++ 5 files changed, 95 insertions(+), 22 deletions(-) delete mode 100644 app/src/lib/utilities/result.ts create mode 100644 app/src/lib/utilities/result/err.ts create mode 100644 app/src/lib/utilities/result/index.ts create mode 100644 app/src/lib/utilities/result/ok.ts create mode 100644 app/src/lib/utilities/result/result.ts diff --git a/app/src/lib/utilities/result.ts b/app/src/lib/utilities/result.ts deleted file mode 100644 index 0eae29d..0000000 --- a/app/src/lib/utilities/result.ts +++ /dev/null @@ -1,22 +0,0 @@ -export class Result { - private constructor( - private readonly isSuccess: boolean, - public readonly value?: T, - public readonly error?: E) {} - - public static ok(value: T): Result { - return new Result(true, value); - } - - public static fail(error: E): Result { - return new Result(false, null, error); - } - - public isOk(): this is Result { - return this.isSuccess; - } - - public isErr(): this is Result { - return !this.isSuccess; - } -} \ No newline at end of file diff --git a/app/src/lib/utilities/result/err.ts b/app/src/lib/utilities/result/err.ts new file mode 100644 index 0000000..6b93823 --- /dev/null +++ b/app/src/lib/utilities/result/err.ts @@ -0,0 +1,36 @@ +export class Err { + #inner: T + + constructor(inner: T) { + this.#inner = inner + } + + get inner(): T { + return this.#inner + } + + /** + * Type guard for `Ok` + * @returns `true` if `Ok`; `false` if `Err` + */ + isOk(): false { + return false + } + + /** + * Type guard for `Err` + * @returns `true` if `Err`; `false` if `Ok` + */ + isErr(): this is Err { + return true + } + + /** + * Create an `Err` + * @param inner + * @returns `Err(inner)` + */ + static new(inner: E): Err { + return new Err(inner) + } +} diff --git a/app/src/lib/utilities/result/index.ts b/app/src/lib/utilities/result/index.ts new file mode 100644 index 0000000..5130b66 --- /dev/null +++ b/app/src/lib/utilities/result/index.ts @@ -0,0 +1,3 @@ +export * from './err' +export * from './ok' +export * from './result' diff --git a/app/src/lib/utilities/result/ok.ts b/app/src/lib/utilities/result/ok.ts new file mode 100644 index 0000000..a219811 --- /dev/null +++ b/app/src/lib/utilities/result/ok.ts @@ -0,0 +1,36 @@ +export class Ok { + #inner: T + + constructor(inner: T) { + this.#inner = inner + } + + get inner(): T { + return this.#inner + } + + /** + * Type guard for `Ok` + * @returns `true` if `Ok`; `false` if `Err` + */ + isOk(): this is Ok { + return true + } + + /** + * Type guard for `Err` + * @returns `true` if `Err`; `false` if `Ok` + */ + isErr(): false { + return false + } + + /** + * Create an `Ok` + * @param inner + * @returns `Ok(inner)` + */ + static new(inner: T): Ok { + return new Ok(inner) + } +} diff --git a/app/src/lib/utilities/result/result.ts b/app/src/lib/utilities/result/result.ts new file mode 100644 index 0000000..ca13c4c --- /dev/null +++ b/app/src/lib/utilities/result/result.ts @@ -0,0 +1,20 @@ +import { Err } from './err' +import { Ok } from './ok' + +export type Result = Ok | Err + +export namespace Result { + /** + * @returns `Ok` + */ + export function ok(value: T) { + return Ok.new(value) + } + + /** + * @returns `Err` + */ + export function err(error: E) { + return Err.new(error) + } +}