Skip to content

Commit 5058bf1

Browse files
feat: introduce isSome/isNone functions (#82)
1 parent 9ce837d commit 5058bf1

File tree

5 files changed

+64
-10
lines changed

5 files changed

+64
-10
lines changed

package-lock.json

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@
3838
"istanbul": "^0.4.5",
3939
"jest": "24.5.0",
4040
"jest-junit": "^6.3.0",
41-
"rollup": "^1.7.4",
41+
"rollup": "^1.8.0",
4242
"semantic-release": "^15.13.3",
4343
"ts-jest": "^24.0.1",
4444
"ts-node": "^8.0.3",
45-
"tslint": "^5.14.0",
45+
"tslint": "^5.15.0",
4646
"tslint-immutable": "^5.5.2",
4747
"typescript": "^3.4.1",
4848
"uglify-js": "^3.5.3"

src/interfaces/maybe.interface.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,16 @@ export interface IMaybe<T> extends IMonad<T> {
7373
*/
7474
map<R>(f: (t: T) => R): IMaybe<R>
7575

76+
/**
77+
* Returns true if value is not empty
78+
*/
79+
isSome(): boolean
80+
81+
/**
82+
* Return true if value is empty
83+
*/
84+
isNone(): boolean
85+
7686
/**
7787
* Combine multiple Maybe
7888
*/

src/monads/maybe.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import { IMaybe, IMaybePattern } from '../interfaces'
22

33
const isEmpty = <T>(value: T) => value === null || value === undefined
44
const isNotEmpty = <T>(value: T) => !isEmpty(value)
5+
const isSome = <T>(value: T) => () => isNotEmpty(value)
6+
const isNone = <T>(value: T) => () => isEmpty(value)
57
const valueOr = <T>(value?: T) => (val: NonNullable<T>) => isEmpty(value) ? val : value as NonNullable<T>
68
const valueOrUndefined = <T>(value?: T) => () => isEmpty(value) ? undefined : value as NonNullable<T>
79
const toArray = <T>(value?: T) => () => isEmpty(value) ? [] : Array.isArray(value) ? value : [value as NonNullable<T>]
@@ -23,10 +25,11 @@ const filter = <T>(value?: T) =>
2325
? maybe(value as NonNullable<T>)
2426
: maybe<T>()
2527

26-
2728
export const maybe = <T>(value?: T): IMaybe<NonNullable<T>> => {
2829
return {
2930
of: maybe,
31+
isSome: isSome(value),
32+
isNone: isNone(value),
3033
valueOr: valueOr(value),
3134
valueOrUndefined: valueOrUndefined(value),
3235
valueOrCompute: valueOrCompute(value),

test/monads/maybe.spec.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,4 +425,45 @@ describe('Maybe', () => {
425425
expect(maybeAString).toBeUndefined()
426426
})
427427
})
428+
429+
describe('isSome', () => {
430+
it('false path', () => {
431+
const sut = undefined as boolean | undefined
432+
const sut2 = null as boolean | null
433+
434+
expect(maybe(sut).isSome()).toEqual(false)
435+
expect(maybe(sut2).isSome()).toEqual(false)
436+
})
437+
438+
it('true path', () => {
439+
const sut = 'test' as string | undefined
440+
const sut2 = 2 as number | undefined
441+
const sut3 = false as boolean
442+
443+
expect(maybe(sut).isSome()).toEqual(true)
444+
expect(maybe(sut2).isSome()).toEqual(true)
445+
expect(maybe(sut3).isSome()).toEqual(true)
446+
expect(maybe(sut).map(a => `${a}_1`).isSome()).toEqual(true)
447+
})
448+
})
449+
450+
describe('isNone', () => {
451+
it('true path', () => {
452+
const sut = undefined as boolean | undefined
453+
const sut2 = null as boolean | null
454+
455+
expect(maybe(sut).isNone()).toEqual(true)
456+
expect(maybe(sut2).isNone()).toEqual(true)
457+
})
458+
459+
it('false path', () => {
460+
const sut = 'test' as string | undefined
461+
const sut2 = 2 as number | undefined
462+
const sut3 = true as boolean | undefined
463+
464+
expect(maybe(sut).isNone()).toEqual(false)
465+
expect(maybe(sut2).isNone()).toEqual(false)
466+
expect(maybe(sut3).isNone()).toEqual(false)
467+
})
468+
})
428469
})

0 commit comments

Comments
 (0)