/** * Result type for operations that can fail * * Inspired by Rust's Result type, this provides a type-safe way to handle * success and error cases without exceptions. */ export interface ResultOk { isOk(): true; isErr(): false; unwrap(): T; unwrapOr(defaultValue: T): T; getError(): never; map(fn: (value: T) => U): ResultOk; } export interface ResultError { isOk(): false; isErr(): true; unwrap(): never; unwrapOr(defaultValue: any): any; getError(): E; map(fn: (value: any) => U): ResultError; } export class Ok implements ResultOk { constructor(private readonly value: T) {} isOk(): true { return true; } isErr(): false { return false; } unwrap(): T { return this.value; } unwrapOr(_defaultValue: T): T { return this.value; } getError(): never { throw new Error('Cannot get error from Ok result'); } map(fn: (value: T) => U): ResultOk { return new Ok(fn(this.value)); } } export class Err implements ResultError { constructor(private readonly error: E) {} isOk(): false { return false; } isErr(): true { return true; } unwrap(): never { throw new Error(`Called unwrap on error: ${this.error}`); } unwrapOr(defaultValue: any): any { return defaultValue; } getError(): E { return this.error; } map(_fn: (value: any) => U): ResultError { return this as any; } } /** * Result type alias */ export type Result = ResultOk | ResultError; /** * Result class with static factory methods * * Usage: * - Result.ok(value) creates a successful Result * - Result.err(error) creates an error Result */ export const Result = { ok(value: T): Result { return new Ok(value); }, err(error: E): Result { return new Err(error); }, };