aboutsummaryrefslogtreecommitdiff
path: root/src/util/result.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/result.ts')
-rw-r--r--src/util/result.ts15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/util/result.ts b/src/util/result.ts
new file mode 100644
index 0000000..ca57c2a
--- /dev/null
+++ b/src/util/result.ts
@@ -0,0 +1,15 @@
+export type Result<T, E> =
+ | { readonly success: true; readonly data: T }
+ | { readonly success: false; readonly error: E };
+
+export const ok = <T>(data: T): Result<T, never> => ({ success: true, data });
+export const err = <E>(error: E): Result<never, E> => ({ success: false, error });
+
+export const map = <T, U, E>(r: Result<T, E>, f: (t: T) => U): Result<U, E> =>
+ r.success ? ok(f(r.data)) : r;
+
+export const andThen = <T, U, E>(r: Result<T, E>, f: (t: T) => Result<U, E>): Result<U, E> =>
+ r.success ? f(r.data) : r;
+
+export const mapErr = <T, E, F>(r: Result<T, E>, f: (e: E) => F): Result<T, F> =>
+ r.success ? r : err(f(r.error));