Skip to content

Commit 0cd967c

Browse files
feat(maybe): extend maybe.tap, introduce tapNone / tapSome (#20)
1 parent cc4ffdc commit 0cd967c

File tree

3 files changed

+34
-2
lines changed

3 files changed

+34
-2
lines changed

src/interfaces/maybe.interface.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,17 @@ export interface IMaybe<T> extends IMonad<T> {
3232
/**
3333
* Execute functions with side-effects.
3434
*/
35-
tap(val: IMaybePattern<T, void>): void
35+
tap(val: Partial<IMaybePattern<T, void>>): void
36+
37+
/**
38+
* Execute a function with side-effects when maybe is a none.
39+
*/
40+
tapNone(f: () => void): void
41+
42+
/**
43+
* Execute a function with side-effects when maybe is a some.
44+
*/
45+
tapSome(f: (val: T) => void): void
3646

3747
/**
3848
* Unwrap and apply MaybePattern functions

src/monads/maybe.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ export function maybe<T>(value?: T): IMaybe<T> {
55
of: (x) => maybe(x),
66
valueOr: (val: T) => value === null || value === undefined ? val : value,
77
valueOrCompute: (f: () => T) => value === null || value === undefined ? f() : value,
8-
tap: (obj: IMaybePattern<T, void>) => value === null || value === undefined ? obj.none() : obj.some(value),
8+
tap: (obj: Partial<IMaybePattern<T, void>>) => value === null || value === undefined ? obj.none && obj.none() : obj.some && obj.some(value),
9+
tapNone: (f: () => void) => (value === null || value === undefined) && f(),
10+
tapSome: (f: (val: T) => void) => value !== null && value !== undefined && f(value),
911
match: <R>(pattern: IMaybePattern<T, R>) => value === null || value === undefined ? pattern.none() : pattern.some(value),
1012
map: <R>(f: (t: T) => R) => value === null || value === undefined ? maybe<R>() : maybe<R>(f(value)),
1113
flatMap: <R>(f: (d: T) => IMaybe<R>) => value === null || value === undefined ? maybe<R>() : f(value)

test/monads/maybe.spec.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,5 +270,25 @@ describe('Maybe', () => {
270270
expect(maybeSomeNumber).toEqual('ok')
271271
})
272272
})
273+
274+
describe('when tapSome', () => {
275+
it('should work', () => {
276+
const sut: string | undefined = 'abc'
277+
278+
expect.assertions(1)
279+
maybe(sut).tapSome(a => expect(a).toEqual('abc'))
280+
maybe(sut).tapNone(() => expect(1).toEqual(1))
281+
})
282+
})
283+
284+
describe('when tapNone', () => {
285+
it('should work', () => {
286+
const sut: string | undefined = undefined
287+
288+
expect.assertions(1)
289+
maybe(sut).tapNone(() => expect(1).toEqual(1))
290+
maybe(sut).tapSome(() => expect(1).toEqual(1))
291+
})
292+
})
273293
})
274294

0 commit comments

Comments
 (0)