/** * Uso: * * const maybeNumber = Maybe.Some(10); * const doubled = maybeNumber.map(n => n * 2); * console.log(doubled.getValue()); // 20 * const noValue = Maybe.None(); * console.log(noValue.isSome()); // false **/ export class Maybe { private constructor(private readonly value?: T) {} static Some(value: T): Maybe { return new Maybe(value); } static None(): Maybe { return new Maybe(); } isSome(): boolean { return this.value !== undefined; } unwrap(): T | undefined { return this.value; } getOrUndefined(): T | undefined { return this.unwrap(); } map(fn: (value: T) => U): Maybe { return this.isSome() ? Maybe.Some(fn(this.value as T)) : Maybe.None(); } }