Skip to content

Commit cdb78e3

Browse files
fix: introduce Maybe monad export
1 parent 9660350 commit cdb78e3

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

src/modules/util/monads/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { Maybe } from './maybe'

src/modules/util/monads/maybe.ts

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// tslint:disable:no-this
2+
// tslint:disable-next-line:no-class
3+
export class Maybe<T> {
4+
private constructor(private value?: T) {}
5+
6+
static some<T>(value: T) {
7+
// tslint:disable-next-line:no-if-statement
8+
if (!value) {
9+
throw Error('Provided value must not be empty')
10+
}
11+
return new Maybe(value)
12+
}
13+
14+
static none<T>() {
15+
return new Maybe<T>(undefined)
16+
}
17+
18+
static fromValue<T>(value: T) {
19+
return value
20+
? Maybe.some<NonNullable<T>>(value as NonNullable<T>)
21+
: Maybe.none<NonNullable<T>>()
22+
}
23+
24+
getOrElse(defaultValue: T) {
25+
return this.value === undefined ? defaultValue : this.value
26+
}
27+
28+
map<R>(f: (wrapped: T) => R): Maybe<R> {
29+
return this.value === undefined
30+
? Maybe.none<R>()
31+
: Maybe.some(f(this.value))
32+
}
33+
34+
doIfSome<R>(f: (wrapped: T) => R): void {
35+
this.value && f(this.value)
36+
}
37+
38+
flattenMap<R>(f: (wrapped: T) => Maybe<R>): Maybe<R> {
39+
return this.value === undefined ? Maybe.none<R>() : f(this.value)
40+
}
41+
}

0 commit comments

Comments
 (0)