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; + } +}