-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathOptional.ts
84 lines (62 loc) · 1.79 KB
/
Optional.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import NoSuchElementException from "./NoSuchElementException";
export default class Optional<T> {
private constructor(private value: T | null) {}
public static empty<T>(): Optional<T> {
return Optional.of<T>(null);
}
public static of<T>(value: T | null): Optional<T> {
return new Optional<T>(value);
}
public filter(f: (v: T) => boolean): Optional<T> {
if (this.value !== null && f(this.value)) {
return Optional.of<T>(this.value);
}
return Optional.empty();
}
public flatMap<U>(f: (v: T) => Optional<U>): Optional<U> {
if (this.value === null) {
return Optional.empty();
}
return f(this.value);
}
public map<U>(f: (v: T) => U): Optional<U> {
if (this.value === null) {
return Optional.empty();
}
return Optional.of(f(this.value));
}
public get(): T {
if (this.value === null) {
throw new NoSuchElementException("Empty value");
}
return this.value;
}
public ifPresent(f: (a: T) => void): void {
if (this.value !== null) {
f(this.value);
}
}
public isPresent(): boolean {
return this.value !== null;
}
public orElse(other: T): T {
const v = this.value ?? other;
if (v === null) {
throw new NoSuchElementException("Empty value");
}
return v;
}
public orElseGet(f: () => T): T {
const v = this.value ?? f();
if (v === null) {
throw new NoSuchElementException("Empty value");
}
return v;
}
public orElseThrow(e: Error): T {
if (this.value === null) {
throw e;
}
return this.value;
}
}