Skip to content

Commit 26519dd

Browse files
refactor(maybe): reduce nested complexity (#40)
1 parent 1825383 commit 26519dd

File tree

1 file changed

+21
-10
lines changed

1 file changed

+21
-10
lines changed

src/monads/maybe.ts

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,28 @@
11
import { IMaybe, IMaybePattern } from "../interfaces"
22

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>> => {
415
return {
516
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)
1526
? maybe()
1627
: fn(value as NonNullable<T>)
1728
? maybe(value as NonNullable<T>)

0 commit comments

Comments
 (0)