From eeb78527f103ace52d08bbc46aefd28d7e05bead Mon Sep 17 00:00:00 2001 From: Patrick Michalina Date: Sat, 27 Oct 2018 11:40:13 -0500 Subject: [PATCH] refactor(maybe): reduce nested complexity --- src/monads/maybe.ts | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/src/monads/maybe.ts b/src/monads/maybe.ts index 6489299..5dde4a3 100644 --- a/src/monads/maybe.ts +++ b/src/monads/maybe.ts @@ -1,17 +1,28 @@ import { IMaybe, IMaybePattern } from "../interfaces" -export function maybe(value?: T): IMaybe> { +const isEmpty = (value: T) => value === null || value === undefined +const isNotEmpty = (value: T) => !isEmpty(value) +const valueOr = (value?: T) => (val: NonNullable) => isEmpty(value) ? val : value as NonNullable +const valueOrCompute = (value?: T) => (fn: () => NonNullable) => isEmpty(value) ? fn() : value as NonNullable +const tap = (value?: T) => (obj: Partial>) => isEmpty(value) ? obj.none && obj.none() : obj.some && obj.some(value as NonNullable) +const tapNone = (value?: T) => (fn: () => void) => (isEmpty(value)) && fn() +const tapSome = (value?: T) => (fn: (val: NonNullable) => void) => isNotEmpty(value) && fn(value as NonNullable) +const match = (value?: T) => (pattern: IMaybePattern) => isEmpty(value) ? pattern.none() : pattern.some(value as NonNullable) +const map = (value?: T) => (fn: (t: NonNullable) => R) => isEmpty(value) ? maybe() : maybe(fn(value as NonNullable)) +const flatMap = (value?: T) => (fn: (d: NonNullable) => IMaybe) => isEmpty(value) ? maybe() : fn(value as NonNullable) + +export const maybe = (value?: T): IMaybe> => { return { of: maybe, - valueOr: (val: NonNullable) => value === null || value === undefined ? val : value as NonNullable, - valueOrCompute: (f: () => NonNullable) => value === null || value === undefined ? f() : value as NonNullable, - tap: (obj: Partial>) => value === null || value === undefined ? obj.none && obj.none() : obj.some && obj.some(value as NonNullable), - tapNone: (f: () => void) => (value === null || value === undefined) && f(), - tapSome: (f: (val: NonNullable) => void) => value !== null && value !== undefined && f(value as NonNullable), - match: (pattern: IMaybePattern) => value === null || value === undefined ? pattern.none() : pattern.some(value as NonNullable), - map: (f: (t: NonNullable) => R) => value === null || value === undefined ? maybe() : maybe(f(value as NonNullable)), - flatMap: (f: (d: NonNullable) => IMaybe) => value === null || value === undefined ? maybe() : f(value as NonNullable), - filter: (fn: (d: NonNullable) => boolean) => value === null || value === undefined + valueOr: valueOr(value), + valueOrCompute: valueOrCompute(value), + tap: tap(value), + tapNone: tapNone(value), + tapSome: tapSome(value), + match: match(value), + map: map(value), + flatMap: flatMap(value), + filter: (fn: (d: NonNullable) => boolean) => isEmpty(value) ? maybe() : fn(value as NonNullable) ? maybe(value as NonNullable)