-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathresult.ts
42 lines (32 loc) · 793 Bytes
/
result.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
enum ResultKind {
Ok,
Err,
}
interface Ok<T> {
kind: ResultKind.Ok;
val: T;
}
interface Err {
kind: ResultKind.Err;
err: Error;
}
type Result<T> = Ok<T> | Err;
function ok<T>(val: T): Ok<T> {
return { kind: ResultKind.Ok, val };
}
function err(err: Error): Err {
return { kind: ResultKind.Err, err };
}
function isOk<T>(val: Result<T>): val is Ok<T> {
return val.kind === ResultKind.Ok;
}
function flatMap<T, U>(fn: (val: T) => Result<U>, res: Result<T>): Result<U> {
return isOk(res) ? fn(res.val) : res;
}
function map<T, U>(fn: (val: T) => U, res: Result<T>): Result<U> {
return flatMap(x => ok(fn(x)), res);
}
function flatten<T>(res: Result<Result<T>>): Result<T> {
return flatMap(x => x, res);
}
export { Result, map, flatMap, flatten, isOk, ok, err };