From 48ed2e9bba317319ab82aeac8e71300cf5fe49a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?T=C3=A1ssio=20Rego?= Date: Thu, 18 Apr 2024 18:40:07 -0300 Subject: [PATCH] feat: add Result functor --- src/Result/Result.ts | 66 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/Result/Result.ts diff --git a/src/Result/Result.ts b/src/Result/Result.ts new file mode 100644 index 0000000..1a889b4 --- /dev/null +++ b/src/Result/Result.ts @@ -0,0 +1,66 @@ +export interface Result { + failure(fn: (value: F) => T): Result; + + success(fn: (value: S) => T): Result; + + isFailure(): boolean; + + isSuccess(): boolean; + + value(): F | S; +} + +export class Failure implements Result { + private constructor(private val: F) {} + + static create(value: F): Result { + return new Failure(value); + } + + failure(fn: (value: F) => T): Result { + return new Failure(fn(this.val)); + } + + success(fn: (value: S) => T): Result { + return this as unknown as Result>; + } + + isFailure(): boolean { + return true; + } + + isSuccess(): boolean { + return false; + } + value(): F | S { + return this.val; + } +} + +export class Success implements Result { + private constructor(private val: S) {} + + static create(value: S): Result { + return new Success(value); + } + + failure(fn: (value: F) => T): Result { + return this as unknown as Result, S>; + } + + success(fn: (value: S) => T): Result { + return new Success(fn(this.val)); + } + + isFailure(): boolean { + return false; + } + + isSuccess(): boolean { + return true; + } + + value(): F | S { + return this.val; + } +}