Uecko_ERP/packages/rdx-utils/src/helpers/maybe.ts

60 lines
1.3 KiB
TypeScript
Raw Normal View History

2025-02-20 18:55:24 +00:00
/**
* Uso:
*
2025-02-25 19:17:30 +00:00
* const maybeNumber = Maybe.some(10);
2025-02-20 18:55:24 +00:00
* const doubled = maybeNumber.map(n => n * 2);
* console.log(doubled.getValue()); // 20
2025-02-25 19:17:30 +00:00
* const noValue = Maybe.none<number>();
2025-02-20 18:55:24 +00:00
* console.log(noValue.isSome()); // false
**/
2025-09-27 11:52:30 +00:00
export interface IMaybe<T> {
isSome(): boolean;
isNone(): boolean;
unwrap(): T | undefined;
getOrUndefined(): T | undefined;
map<U>(fn: (value: T) => U): IMaybe<U>;
match<U>(someFn: (value: T) => U, noneFn: () => U): U;
}
export class Maybe<T> implements IMaybe<T> {
2025-02-20 18:55:24 +00:00
private constructor(private readonly value?: T) {}
2025-02-25 19:17:30 +00:00
static fromNullable<T>(value?: T): Maybe<T> {
return value === undefined || value === null ? Maybe.none() : Maybe.some(value);
}
static some<T>(value: T): Maybe<T> {
2025-02-20 18:55:24 +00:00
return new Maybe<T>(value);
}
2025-02-25 19:17:30 +00:00
static none<T>(): Maybe<T> {
2025-02-20 18:55:24 +00:00
return new Maybe<T>();
}
isSome(): boolean {
return this.value !== undefined;
}
2025-02-25 10:16:34 +00:00
isNone(): boolean {
return !this.isSome();
}
2025-02-24 19:00:28 +00:00
unwrap(): T | undefined {
2025-02-20 18:55:24 +00:00
return this.value;
}
2025-02-24 19:00:28 +00:00
getOrUndefined(): T | undefined {
return this.unwrap();
}
2025-02-20 18:55:24 +00:00
map<U>(fn: (value: T) => U): Maybe<U> {
2025-02-25 19:17:30 +00:00
return this.isSome() ? Maybe.some(fn(this.value as T)) : Maybe.none();
2025-02-20 18:55:24 +00:00
}
2025-09-01 14:07:59 +00:00
match<U>(someFn: (value: T) => U, noneFn: () => U): U {
return this.isSome() ? someFn(this.value as T) : noneFn();
}
2025-02-20 18:55:24 +00:00
}