|
1 | 1 | import { IMaybe, IMaybePattern } from "../interfaces"
|
2 | 2 |
|
3 |
| -export function maybe<T>(value?: T): IMaybe<NonNullable<T>> { |
| 3 | +const isEmpty = <T>(value: T) => value === null || value === undefined |
| 4 | +const isNotEmpty = <T>(value: T) => !isEmpty(value) |
| 5 | +const valueOr = <T>(value?: T) => (val: NonNullable<T>) => isEmpty(value) ? val : value as NonNullable<T> |
| 6 | +const valueOrCompute = <T>(value?: T) => (fn: () => NonNullable<T>) => isEmpty(value) ? fn() : value as NonNullable<T> |
| 7 | +const tap = <T>(value?: T) => (obj: Partial<IMaybePattern<T, void>>) => isEmpty(value) ? obj.none && obj.none() : obj.some && obj.some(value as NonNullable<T>) |
| 8 | +const tapNone = <T>(value?: T) => (fn: () => void) => (isEmpty(value)) && fn() |
| 9 | +const tapSome = <T>(value?: T) => (fn: (val: NonNullable<T>) => void) => isNotEmpty(value) && fn(value as NonNullable<T>) |
| 10 | +const match = <T>(value?: T) => <R>(pattern: IMaybePattern<T, R>) => isEmpty(value) ? pattern.none() : pattern.some(value as NonNullable<T>) |
| 11 | +const map = <T>(value?: T) => <R>(fn: (t: NonNullable<T>) => R) => isEmpty(value) ? maybe<R>() : maybe<R>(fn(value as NonNullable<T>)) |
| 12 | +const flatMap = <T>(value?: T) => <R>(fn: (d: NonNullable<T>) => IMaybe<R>) => isEmpty(value) ? maybe<R>() : fn(value as NonNullable<T>) |
| 13 | + |
| 14 | +export const maybe = <T>(value?: T): IMaybe<NonNullable<T>> => { |
4 | 15 | return {
|
5 | 16 | of: maybe,
|
6 |
| - valueOr: (val: NonNullable<T>) => value === null || value === undefined ? val : value as NonNullable<T>, |
7 |
| - valueOrCompute: (f: () => NonNullable<T>) => value === null || value === undefined ? f() : value as NonNullable<T>, |
8 |
| - tap: (obj: Partial<IMaybePattern<T, void>>) => value === null || value === undefined ? obj.none && obj.none() : obj.some && obj.some(value as NonNullable<T>), |
9 |
| - tapNone: (f: () => void) => (value === null || value === undefined) && f(), |
10 |
| - tapSome: (f: (val: NonNullable<T>) => void) => value !== null && value !== undefined && f(value as NonNullable<T>), |
11 |
| - match: <R>(pattern: IMaybePattern<T, R>) => value === null || value === undefined ? pattern.none() : pattern.some(value as NonNullable<T>), |
12 |
| - map: <R>(f: (t: NonNullable<T>) => R) => value === null || value === undefined ? maybe<R>() : maybe<R>(f(value as NonNullable<T>)), |
13 |
| - flatMap: <R>(f: (d: NonNullable<T>) => IMaybe<R>) => value === null || value === undefined ? maybe<R>() : f(value as NonNullable<T>), |
14 |
| - filter: (fn: (d: NonNullable<T>) => boolean) => value === null || value === undefined |
| 17 | + valueOr: valueOr(value), |
| 18 | + valueOrCompute: valueOrCompute(value), |
| 19 | + tap: tap(value), |
| 20 | + tapNone: tapNone(value), |
| 21 | + tapSome: tapSome(value), |
| 22 | + match: match(value), |
| 23 | + map: map(value), |
| 24 | + flatMap: flatMap(value), |
| 25 | + filter: (fn: (d: NonNullable<T>) => boolean) => isEmpty(value) |
15 | 26 | ? maybe()
|
16 | 27 | : fn(value as NonNullable<T>)
|
17 | 28 | ? maybe(value as NonNullable<T>)
|
|
0 commit comments