@iahuang/result-ts 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ian Huang
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,89 @@
1
+ # `result-ts`
2
+
3
+ A Typescript implementation of Rust's [`std::result::Result`](https://doc.rust-lang.org/std/result/enum.Result.html) enum type. Make errors in fallible subroutines predictable and impossible to ignore.
4
+
5
+ ## Example Usage
6
+
7
+ ```ts
8
+ type ParseErrors = {
9
+ invalid_number: string; // the string that failed to parse as a number
10
+ negative: number; // the number that was negative
11
+ };
12
+
13
+ const parseResult = resultType<number, ParseErrors>();
14
+
15
+ type ParseError = Err<ParseErrors>; // { ok: false, error: "invalid_number", detail: string } | { ok: false, error: "negative", detail: number }
16
+ type ParseOk = Ok<number>; // { ok: true, value: number }
17
+
18
+ type ParseResult = ResultType<typeof parseResult>; // ParseError | ParseOk
19
+
20
+ function parseIntStrict(s: string): ParseResult {
21
+ const n = Number.parseInt(s, 10);
22
+ if (Number.isNaN(n)) return parseResult.err("invalid_number", s);
23
+ if (n < 0) return parseResult.err("negative", n);
24
+ return parseResult.ok(n);
25
+ }
26
+
27
+ const timesTwo = resultMap(parseIntStrict("123"), (n) => n * 2);
28
+
29
+ // construct plain results manually
30
+ const okResult = parseResult.ok(123); // { ok: true, value: 123 }
31
+ const errResult = parseResult.err("invalid_number", "123"); // { ok: false, error: "invalid_number", detail: "123" }
32
+ ```
33
+
34
+ The equivalent Rust code is:
35
+
36
+ ```rust
37
+ enum ParseError {
38
+ InvalidNumber(String),
39
+ Negative(i32),
40
+ }
41
+
42
+ fn parse_int_strict(s: &str) -> Result<i32, ParseError> {
43
+ match s.parse::<i32>() {
44
+ Ok(n) => {
45
+ if n < 0 {
46
+ Err(ParseError::Negative(n))
47
+ } else {
48
+ Ok(n)
49
+ }
50
+ },
51
+ Err(_) => Err(ParseError::InvalidNumber(s.to_string())),
52
+ }
53
+ }
54
+
55
+ let times_two = parse_int_strict("123").map(|n| n * 2);
56
+
57
+ let ok_result = Ok(123);
58
+ let err_result = Err(ParseError::InvalidNumber("123".to_string()));
59
+ ```
60
+
61
+ ### Chain API
62
+
63
+ For readability, this library also provides a method chaining API.
64
+
65
+ ```ts
66
+ const timesTwo = chain(parseIntStrict("123"))
67
+ .map((n) => n * 2)
68
+ .unwrapOr(0);
69
+ ```
70
+
71
+ This more closely resembles the equivalent Rust code:
72
+
73
+ ```rust
74
+ let times_two = parse_int_strict("123")
75
+ .map(|n| n * 2)
76
+ .unwrap_or(0);
77
+ ```
78
+
79
+ ## Comparison with Other Libraries
80
+
81
+ ### `neverthrow`
82
+
83
+ Unlike `neverthrow`, the canonical representation of a result is a plain object with type information
84
+ rather than a class instance. This allows for result types to be safely serialized and deserialized,
85
+ as `Result` types contain neither methods nor class information!
86
+
87
+ `neverthrow` provides a perfectly valid solution to this problem statement; this library aims to
88
+ act more as lighter, type-safe wrapper around plain Javascript constructs rather than creating new types
89
+ entirely.
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Usage
3
+ *
4
+ * ```ts
5
+ * type ParseErrors = {
6
+ * invalid_number: string;
7
+ * negative: number;
8
+ * };
9
+ *
10
+ * const parseResult = resultType<number, ParseErrors>();
11
+ * type ParseResult = ResultType<typeof parseResult>;
12
+ * type ParseError = Err<ParseErrors>;
13
+ * type ParseOk = Ok<number>;
14
+ *
15
+ * function parseIntStrict(s: string): ParseResult {
16
+ * if (!/^-?\d+$/.test(s)) return parseResult.err("invalid_number", s);
17
+ * return parseResult.ok(Number.parseInt(s, 10));
18
+ * }
19
+ * ```
20
+ */
21
+ export type Err<E> = {
22
+ [K in keyof E]: {
23
+ ok: false;
24
+ error: K;
25
+ detail: E[K];
26
+ };
27
+ }[keyof E];
28
+ export type Ok<T> = {
29
+ ok: true;
30
+ error?: never;
31
+ value: T;
32
+ };
33
+ export type Result<T, E> = Err<E> | Ok<T>;
34
+ export type Undetailed<E extends string> = {
35
+ [K in E]: undefined;
36
+ };
37
+ export declare function ok<T>(value: T): Ok<T>;
38
+ export type OkConstructor<T> = (value: T) => Ok<T>;
39
+ export type ErrConstructor<E> = <K extends keyof E>(error: K, ...args: E[K] extends undefined ? [] : [detail: E[K]]) => Err<E>;
40
+ export declare function okConstructor<T>(): OkConstructor<T>;
41
+ export declare function errConstructor<E>(): <K extends keyof E>(error: K, ...args: E[K] extends undefined ? [] : [detail: E[K]]) => Err<E>;
42
+ type ResultConstructors<T, E> = {
43
+ ok: OkConstructor<T>;
44
+ err: ErrConstructor<E>;
45
+ __result: Result<T, E>;
46
+ };
47
+ export declare function resultType<T, E>(): ResultConstructors<T, E>;
48
+ export type ResultType<T extends ResultConstructors<any, any>> = T["__result"];
49
+ export declare function resultAnd<T, E>(result: Result<T, E>, other: Result<T, E>): Result<T, E>;
50
+ export declare function resultAndThen<T, E, R>(result: Result<T, E>, fn: (value: T) => Result<R, E>): Result<R, E>;
51
+ export declare function resultErr<T, E>(result: Result<T, E>): Err<E> | null;
52
+ export declare function resultExpect<T, E>(result: Result<T, E>, msg: string): T;
53
+ export declare function resultExpectErr<T, E>(result: Result<T, E>, msg: string): Err<E>;
54
+ export declare function resultFlatten<T, E>(result: Result<Result<T, E>, E>): Result<T, E>;
55
+ export declare function resultInspect<T, E>(result: Result<T, E>, fn: (value: T) => void): Result<T, E>;
56
+ export declare function resultInspectErr<T, E>(result: Result<T, E>, fn: (err: Err<E>) => void): Result<T, E>;
57
+ export declare function resultIsErr<T, E>(r: Result<T, E>): r is Err<E>;
58
+ export declare function resultIsErrAnd<T, E>(r: Result<T, E>, fn: (err: Err<E>) => boolean): boolean;
59
+ export declare function resultIsOk<T, E>(r: Result<T, E>): r is Ok<T>;
60
+ export declare function resultIsOkAnd<T, E>(r: Result<T, E>, fn: (value: T) => boolean): boolean;
61
+ export declare function resultMap<T, E, R>(result: Result<T, E>, fn: (value: T) => R): Result<R, E>;
62
+ export declare function resultMapErr<T, E, F>(result: Result<T, E>, fn: (err: Err<E>) => Err<F>): Result<T, F>;
63
+ export declare function resultMapOr<T, E, R>(result: Result<T, E>, defaultValue: R, fn: (value: T) => R): R;
64
+ export declare function resultMapOrElse<T, E, R>(result: Result<T, E>, defaultValue: (err: Err<E>) => R, fn: (value: T) => R): R;
65
+ export declare function resultOk<T, E>(result: Result<T, E>): T | null;
66
+ export declare function resultOr<T, E>(result: Result<T, E>, other: Result<T, E>): Result<T, E>;
67
+ export declare function resultOrElse<T, E>(result: Result<T, E>, fn: (err: Err<E>) => Result<T, E>): Result<T, E>;
68
+ export declare function resultUnwrap<T, E>(result: Result<T, E>): T;
69
+ export declare function resultUnwrapErr<T, E>(result: Result<T, E>): Err<E>;
70
+ export declare function resultUnwrapOr<T, E>(result: Result<T, E>, defaultValue: T): T;
71
+ export declare function resultUnwrapOrElse<T, E>(result: Result<T, E>, fn: (err: Err<E>) => T): T;
72
+ export declare function tryCatchResult<T, E>(fn: () => T, err: (e: unknown) => Err<E>): Result<T, E>;
73
+ export declare function tryCatchResultAsync<T, E>(fn: () => Promise<T>, err: (e: unknown) => Err<E>): Promise<Result<T, E>>;
74
+ type ChainAnd<T, E> = (other: Result<T, E>) => Chain<T, E>;
75
+ type ChainAndThen<I, E> = <O>(fn: (value: I) => Result<O, E>) => Chain<O, E>;
76
+ type ChainMap<I, E> = <O>(fn: (value: I) => O) => Chain<O, E>;
77
+ type ChainMapErr<T, E> = <F>(fn: (err: Err<E>) => Err<F>) => Chain<T, F>;
78
+ type ChainMapOr<I> = <R>(defaultValue: R, fn: (value: I) => R) => R;
79
+ type ChainMapOrElse<I, E> = <R>(defaultValue: (err: Err<E>) => R, fn: (value: I) => R) => R;
80
+ type ChainOr<T, E> = (other: Result<T, E>) => Chain<T, E>;
81
+ type ChainOrElse<T, E> = (fn: (err: Err<E>) => Result<T, E>) => Chain<T, E>;
82
+ type ChainUnwrap<T> = () => T;
83
+ type ChainUnwrapOr<T> = (defaultValue: T) => T;
84
+ type ChainUnwrapOrElse<T, E> = (fn: (err: Err<E>) => T) => T;
85
+ type ChainExpect<T> = (msg: string) => T;
86
+ type ChainExpectErr<E> = (msg: string) => Err<E>;
87
+ type ChainUnwrapErr<E> = () => Err<E>;
88
+ type ChainFlatten<T, E> = () => Chain<T, E>;
89
+ type ChainInspect<T, E> = (fn: (value: T) => void) => Chain<T, E>;
90
+ type ChainInspectErr<T, E> = (fn: (err: Err<E>) => void) => Chain<T, E>;
91
+ type ChainIsOk<T, E> = () => boolean & {
92
+ __phantom?: [T, E];
93
+ };
94
+ type ChainIsErr<T, E> = () => boolean & {
95
+ __phantom?: [T, E];
96
+ };
97
+ type ChainIsOkAnd<T> = (fn: (value: T) => boolean) => boolean;
98
+ type ChainIsErrAnd<E> = (fn: (err: Err<E>) => boolean) => boolean;
99
+ type ChainOk<T> = () => T | null;
100
+ type ChainErr<E> = () => Err<E> | null;
101
+ type Chain<T, E> = {
102
+ result: Result<T, E>;
103
+ and: ChainAnd<T, E>;
104
+ andThen: ChainAndThen<T, E>;
105
+ map: ChainMap<T, E>;
106
+ mapErr: ChainMapErr<T, E>;
107
+ mapOr: ChainMapOr<T>;
108
+ mapOrElse: ChainMapOrElse<T, E>;
109
+ or: ChainOr<T, E>;
110
+ orElse: ChainOrElse<T, E>;
111
+ unwrap: ChainUnwrap<T>;
112
+ unwrapOr: ChainUnwrapOr<T>;
113
+ unwrapOrElse: ChainUnwrapOrElse<T, E>;
114
+ expect: ChainExpect<T>;
115
+ expectErr: ChainExpectErr<E>;
116
+ unwrapErr: ChainUnwrapErr<E>;
117
+ flatten: T extends Result<infer U, E> ? ChainFlatten<U, E> : never;
118
+ inspect: ChainInspect<T, E>;
119
+ inspectErr: ChainInspectErr<T, E>;
120
+ isOk: ChainIsOk<T, E>;
121
+ isErr: ChainIsErr<T, E>;
122
+ isOkAnd: ChainIsOkAnd<T>;
123
+ isErrAnd: ChainIsErrAnd<E>;
124
+ ok: ChainOk<T>;
125
+ err: ChainErr<E>;
126
+ };
127
+ export declare function chain<I, E>(initial: Result<I, E>): Chain<I, E>;
128
+ export {};
129
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,226 @@
1
+ /**
2
+ * Usage
3
+ *
4
+ * ```ts
5
+ * type ParseErrors = {
6
+ * invalid_number: string;
7
+ * negative: number;
8
+ * };
9
+ *
10
+ * const parseResult = resultType<number, ParseErrors>();
11
+ * type ParseResult = ResultType<typeof parseResult>;
12
+ * type ParseError = Err<ParseErrors>;
13
+ * type ParseOk = Ok<number>;
14
+ *
15
+ * function parseIntStrict(s: string): ParseResult {
16
+ * if (!/^-?\d+$/.test(s)) return parseResult.err("invalid_number", s);
17
+ * return parseResult.ok(Number.parseInt(s, 10));
18
+ * }
19
+ * ```
20
+ */
21
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
22
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
23
+ return new (P || (P = Promise))(function (resolve, reject) {
24
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
25
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
26
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
27
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
28
+ });
29
+ };
30
+ var __generator = (this && this.__generator) || function (thisArg, body) {
31
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
32
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
33
+ function verb(n) { return function (v) { return step([n, v]); }; }
34
+ function step(op) {
35
+ if (f) throw new TypeError("Generator is already executing.");
36
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
37
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
38
+ if (y = 0, t) op = [op[0] & 2, t.value];
39
+ switch (op[0]) {
40
+ case 0: case 1: t = op; break;
41
+ case 4: _.label++; return { value: op[1], done: false };
42
+ case 5: _.label++; y = op[1]; op = [0]; continue;
43
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
44
+ default:
45
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
46
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
47
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
48
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
49
+ if (t[2]) _.ops.pop();
50
+ _.trys.pop(); continue;
51
+ }
52
+ op = body.call(thisArg, _);
53
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
54
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
55
+ }
56
+ };
57
+ export function ok(value) {
58
+ return { ok: true, value: value };
59
+ }
60
+ export function okConstructor() {
61
+ return (function (value) { return ({ ok: true, value: value }); });
62
+ }
63
+ export function errConstructor() {
64
+ return function (error) {
65
+ var args = [];
66
+ for (var _i = 1; _i < arguments.length; _i++) {
67
+ args[_i - 1] = arguments[_i];
68
+ }
69
+ return {
70
+ ok: false,
71
+ error: error,
72
+ detail: args[0],
73
+ };
74
+ };
75
+ }
76
+ export function resultType() {
77
+ return {
78
+ ok: okConstructor(),
79
+ err: errConstructor(),
80
+ __result: undefined,
81
+ };
82
+ }
83
+ export function resultAnd(result, other) {
84
+ return result.ok ? other : result;
85
+ }
86
+ export function resultAndThen(result, fn) {
87
+ return result.ok ? fn(result.value) : result;
88
+ }
89
+ export function resultErr(result) {
90
+ return !result.ok ? result : null;
91
+ }
92
+ export function resultExpect(result, msg) {
93
+ if (!result.ok) {
94
+ throw new Error(msg);
95
+ }
96
+ return result.value;
97
+ }
98
+ export function resultExpectErr(result, msg) {
99
+ if (result.ok) {
100
+ throw new Error(msg);
101
+ }
102
+ return result;
103
+ }
104
+ export function resultFlatten(result) {
105
+ return result.ok ? result.value : result;
106
+ }
107
+ export function resultInspect(result, fn) {
108
+ if (result.ok) {
109
+ fn(result.value);
110
+ }
111
+ return result;
112
+ }
113
+ export function resultInspectErr(result, fn) {
114
+ if (!result.ok) {
115
+ fn(result);
116
+ }
117
+ return result;
118
+ }
119
+ export function resultIsErr(r) {
120
+ return !r.ok;
121
+ }
122
+ export function resultIsErrAnd(r, fn) {
123
+ return !r.ok && fn(r);
124
+ }
125
+ export function resultIsOk(r) {
126
+ return r.ok;
127
+ }
128
+ export function resultIsOkAnd(r, fn) {
129
+ return r.ok && fn(r.value);
130
+ }
131
+ export function resultMap(result, fn) {
132
+ return result.ok ? ok(fn(result.value)) : result;
133
+ }
134
+ export function resultMapErr(result, fn) {
135
+ return result.ok ? result : fn(result);
136
+ }
137
+ export function resultMapOr(result, defaultValue, fn) {
138
+ return result.ok ? fn(result.value) : defaultValue;
139
+ }
140
+ export function resultMapOrElse(result, defaultValue, fn) {
141
+ return result.ok ? fn(result.value) : defaultValue(result);
142
+ }
143
+ export function resultOk(result) {
144
+ return result.ok ? result.value : null;
145
+ }
146
+ export function resultOr(result, other) {
147
+ return result.ok ? result : other;
148
+ }
149
+ export function resultOrElse(result, fn) {
150
+ return result.ok ? result : fn(result);
151
+ }
152
+ export function resultUnwrap(result) {
153
+ if (!result.ok) {
154
+ throw result;
155
+ }
156
+ return result.value;
157
+ }
158
+ export function resultUnwrapErr(result) {
159
+ if (result.ok) {
160
+ throw new Error("Result is ok; expected an error");
161
+ }
162
+ return result;
163
+ }
164
+ export function resultUnwrapOr(result, defaultValue) {
165
+ return result.ok ? result.value : defaultValue;
166
+ }
167
+ export function resultUnwrapOrElse(result, fn) {
168
+ return result.ok ? result.value : fn(result);
169
+ }
170
+ export function tryCatchResult(fn, err) {
171
+ try {
172
+ return ok(fn());
173
+ }
174
+ catch (e) {
175
+ return err(e);
176
+ }
177
+ }
178
+ export function tryCatchResultAsync(fn, err) {
179
+ return __awaiter(this, void 0, void 0, function () {
180
+ var _a, e_1;
181
+ return __generator(this, function (_b) {
182
+ switch (_b.label) {
183
+ case 0:
184
+ _b.trys.push([0, 2, , 3]);
185
+ _a = ok;
186
+ return [4 /*yield*/, fn()];
187
+ case 1: return [2 /*return*/, _a.apply(void 0, [_b.sent()])];
188
+ case 2:
189
+ e_1 = _b.sent();
190
+ return [2 /*return*/, err(e_1)];
191
+ case 3: return [2 /*return*/];
192
+ }
193
+ });
194
+ });
195
+ }
196
+ export function chain(initial) {
197
+ return {
198
+ result: initial,
199
+ and: function (other) { return chain(resultAnd(initial, other)); },
200
+ andThen: function (fn) { return chain(resultAndThen(initial, fn)); },
201
+ map: function (fn) { return chain(resultMap(initial, fn)); },
202
+ mapErr: function (fn) { return chain(resultMapErr(initial, fn)); },
203
+ mapOr: function (defaultValue, fn) { return resultMapOr(initial, defaultValue, fn); },
204
+ mapOrElse: function (defaultValue, fn) {
205
+ return resultMapOrElse(initial, defaultValue, fn);
206
+ },
207
+ or: function (other) { return chain(resultOr(initial, other)); },
208
+ orElse: function (fn) { return chain(resultOrElse(initial, fn)); },
209
+ unwrap: function () { return resultUnwrap(initial); },
210
+ unwrapOr: function (defaultValue) { return resultUnwrapOr(initial, defaultValue); },
211
+ unwrapOrElse: function (fn) { return resultUnwrapOrElse(initial, fn); },
212
+ expect: function (msg) { return resultExpect(initial, msg); },
213
+ expectErr: function (msg) { return resultExpectErr(initial, msg); },
214
+ unwrapErr: function () { return resultUnwrapErr(initial); },
215
+ flatten: (function () { return chain(resultFlatten(initial)); }),
216
+ inspect: function (fn) { return chain(resultInspect(initial, fn)); },
217
+ inspectErr: function (fn) { return chain(resultInspectErr(initial, fn)); },
218
+ isOk: function () { return resultIsOk(initial); },
219
+ isErr: function () { return resultIsErr(initial); },
220
+ isOkAnd: function (fn) { return resultIsOkAnd(initial, fn); },
221
+ isErrAnd: function (fn) { return resultIsErrAnd(initial, fn); },
222
+ ok: function () { return resultOk(initial); },
223
+ err: function () { return resultErr(initial); },
224
+ };
225
+ }
226
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
package/index.ts ADDED
@@ -0,0 +1,314 @@
1
+ /**
2
+ * Usage
3
+ *
4
+ * ```ts
5
+ * type ParseErrors = {
6
+ * invalid_number: string;
7
+ * negative: number;
8
+ * };
9
+ *
10
+ * const parseResult = resultType<number, ParseErrors>();
11
+ * type ParseResult = ResultType<typeof parseResult>;
12
+ * type ParseError = Err<ParseErrors>;
13
+ * type ParseOk = Ok<number>;
14
+ *
15
+ * function parseIntStrict(s: string): ParseResult {
16
+ * if (!/^-?\d+$/.test(s)) return parseResult.err("invalid_number", s);
17
+ * return parseResult.ok(Number.parseInt(s, 10));
18
+ * }
19
+ * ```
20
+ */
21
+
22
+ export type Err<E> = {
23
+ [K in keyof E]: {
24
+ ok: false;
25
+ error: K;
26
+ detail: E[K];
27
+ };
28
+ }[keyof E];
29
+
30
+ export type Ok<T> = {
31
+ ok: true;
32
+ error?: never;
33
+ value: T;
34
+ };
35
+
36
+ export type Result<T, E> = Err<E> | Ok<T>;
37
+
38
+ export type Undetailed<E extends string> = {
39
+ [K in E]: undefined;
40
+ };
41
+
42
+ export function ok<T>(value: T): Ok<T> {
43
+ return { ok: true, value };
44
+ }
45
+
46
+ export type OkConstructor<T> = (value: T) => Ok<T>;
47
+
48
+ export type ErrConstructor<E> = <K extends keyof E>(
49
+ error: K,
50
+ ...args: E[K] extends undefined ? [] : [detail: E[K]]
51
+ ) => Err<E>;
52
+
53
+ export function okConstructor<T>(): OkConstructor<T> {
54
+ return ((value: T) => ({ ok: true, value })) as OkConstructor<T>;
55
+ }
56
+
57
+ export function errConstructor<E>() {
58
+ return <K extends keyof E>(
59
+ error: K,
60
+ ...args: E[K] extends undefined ? [] : [detail: E[K]]
61
+ ): Err<E> => {
62
+ return {
63
+ ok: false,
64
+ error,
65
+ detail: args[0] as E[K],
66
+ };
67
+ };
68
+ }
69
+
70
+ type ResultConstructors<T, E> = {
71
+ ok: OkConstructor<T>;
72
+ err: ErrConstructor<E>;
73
+ __result: Result<T, E>;
74
+ };
75
+
76
+ export function resultType<T, E>(): ResultConstructors<T, E> {
77
+ return {
78
+ ok: okConstructor(),
79
+ err: errConstructor(),
80
+ __result: undefined as unknown as Result<T, E>,
81
+ } as ResultConstructors<T, E>;
82
+ }
83
+
84
+ export type ResultType<T extends ResultConstructors<any, any>> = T["__result"];
85
+
86
+ export function resultAnd<T, E>(result: Result<T, E>, other: Result<T, E>): Result<T, E> {
87
+ return result.ok ? other : result;
88
+ }
89
+
90
+ export function resultAndThen<T, E, R>(
91
+ result: Result<T, E>,
92
+ fn: (value: T) => Result<R, E>
93
+ ): Result<R, E> {
94
+ return result.ok ? fn(result.value) : result;
95
+ }
96
+
97
+ export function resultErr<T, E>(result: Result<T, E>): Err<E> | null {
98
+ return !result.ok ? result : null;
99
+ }
100
+
101
+ export function resultExpect<T, E>(result: Result<T, E>, msg: string): T {
102
+ if (!result.ok) {
103
+ throw new Error(msg);
104
+ }
105
+ return result.value;
106
+ }
107
+
108
+ export function resultExpectErr<T, E>(result: Result<T, E>, msg: string): Err<E> {
109
+ if (result.ok) {
110
+ throw new Error(msg);
111
+ }
112
+ return result;
113
+ }
114
+
115
+ export function resultFlatten<T, E>(result: Result<Result<T, E>, E>): Result<T, E> {
116
+ return result.ok ? result.value : result;
117
+ }
118
+
119
+ export function resultInspect<T, E>(result: Result<T, E>, fn: (value: T) => void): Result<T, E> {
120
+ if (result.ok) {
121
+ fn(result.value);
122
+ }
123
+ return result;
124
+ }
125
+
126
+ export function resultInspectErr<T, E>(
127
+ result: Result<T, E>,
128
+ fn: (err: Err<E>) => void
129
+ ): Result<T, E> {
130
+ if (!result.ok) {
131
+ fn(result);
132
+ }
133
+ return result;
134
+ }
135
+
136
+ export function resultIsErr<T, E>(r: Result<T, E>): r is Err<E> {
137
+ return !r.ok;
138
+ }
139
+
140
+ export function resultIsErrAnd<T, E>(r: Result<T, E>, fn: (err: Err<E>) => boolean): boolean {
141
+ return !r.ok && fn(r);
142
+ }
143
+
144
+ export function resultIsOk<T, E>(r: Result<T, E>): r is Ok<T> {
145
+ return r.ok;
146
+ }
147
+
148
+ export function resultIsOkAnd<T, E>(r: Result<T, E>, fn: (value: T) => boolean): boolean {
149
+ return r.ok && fn(r.value);
150
+ }
151
+
152
+ export function resultMap<T, E, R>(result: Result<T, E>, fn: (value: T) => R): Result<R, E> {
153
+ return result.ok ? ok(fn(result.value)) : result;
154
+ }
155
+
156
+ export function resultMapErr<T, E, F>(
157
+ result: Result<T, E>,
158
+ fn: (err: Err<E>) => Err<F>
159
+ ): Result<T, F> {
160
+ return result.ok ? (result as Ok<T>) : fn(result);
161
+ }
162
+
163
+ export function resultMapOr<T, E, R>(
164
+ result: Result<T, E>,
165
+ defaultValue: R,
166
+ fn: (value: T) => R
167
+ ): R {
168
+ return result.ok ? fn(result.value) : defaultValue;
169
+ }
170
+
171
+ export function resultMapOrElse<T, E, R>(
172
+ result: Result<T, E>,
173
+ defaultValue: (err: Err<E>) => R,
174
+ fn: (value: T) => R
175
+ ): R {
176
+ return result.ok ? fn(result.value) : defaultValue(result);
177
+ }
178
+
179
+ export function resultOk<T, E>(result: Result<T, E>): T | null {
180
+ return result.ok ? result.value : null;
181
+ }
182
+
183
+ export function resultOr<T, E>(result: Result<T, E>, other: Result<T, E>): Result<T, E> {
184
+ return result.ok ? result : other;
185
+ }
186
+
187
+ export function resultOrElse<T, E>(
188
+ result: Result<T, E>,
189
+ fn: (err: Err<E>) => Result<T, E>
190
+ ): Result<T, E> {
191
+ return result.ok ? result : fn(result);
192
+ }
193
+
194
+ export function resultUnwrap<T, E>(result: Result<T, E>): T {
195
+ if (!result.ok) {
196
+ throw result;
197
+ }
198
+ return result.value;
199
+ }
200
+
201
+ export function resultUnwrapErr<T, E>(result: Result<T, E>): Err<E> {
202
+ if (result.ok) {
203
+ throw new Error("Result is ok; expected an error");
204
+ }
205
+ return result;
206
+ }
207
+
208
+ export function resultUnwrapOr<T, E>(result: Result<T, E>, defaultValue: T): T {
209
+ return result.ok ? result.value : defaultValue;
210
+ }
211
+
212
+ export function resultUnwrapOrElse<T, E>(result: Result<T, E>, fn: (err: Err<E>) => T): T {
213
+ return result.ok ? result.value : fn(result);
214
+ }
215
+
216
+ export function tryCatchResult<T, E>(fn: () => T, err: (e: unknown) => Err<E>): Result<T, E> {
217
+ try {
218
+ return ok(fn());
219
+ } catch (e) {
220
+ return err(e);
221
+ }
222
+ }
223
+
224
+ export async function tryCatchResultAsync<T, E>(
225
+ fn: () => Promise<T>,
226
+ err: (e: unknown) => Err<E>
227
+ ): Promise<Result<T, E>> {
228
+ try {
229
+ return ok(await fn());
230
+ } catch (e) {
231
+ return err(e);
232
+ }
233
+ }
234
+
235
+ type ChainAnd<T, E> = (other: Result<T, E>) => Chain<T, E>;
236
+ type ChainAndThen<I, E> = <O>(fn: (value: I) => Result<O, E>) => Chain<O, E>;
237
+ type ChainMap<I, E> = <O>(fn: (value: I) => O) => Chain<O, E>;
238
+ type ChainMapErr<T, E> = <F>(fn: (err: Err<E>) => Err<F>) => Chain<T, F>;
239
+ type ChainMapOr<I> = <R>(defaultValue: R, fn: (value: I) => R) => R;
240
+ type ChainMapOrElse<I, E> = <R>(defaultValue: (err: Err<E>) => R, fn: (value: I) => R) => R;
241
+ type ChainOr<T, E> = (other: Result<T, E>) => Chain<T, E>;
242
+ type ChainOrElse<T, E> = (fn: (err: Err<E>) => Result<T, E>) => Chain<T, E>;
243
+ type ChainUnwrap<T> = () => T;
244
+ type ChainUnwrapOr<T> = (defaultValue: T) => T;
245
+ type ChainUnwrapOrElse<T, E> = (fn: (err: Err<E>) => T) => T;
246
+ type ChainExpect<T> = (msg: string) => T;
247
+ type ChainExpectErr<E> = (msg: string) => Err<E>;
248
+ type ChainUnwrapErr<E> = () => Err<E>;
249
+ type ChainFlatten<T, E> = () => Chain<T, E>;
250
+ type ChainInspect<T, E> = (fn: (value: T) => void) => Chain<T, E>;
251
+ type ChainInspectErr<T, E> = (fn: (err: Err<E>) => void) => Chain<T, E>;
252
+ type ChainIsOk<T, E> = () => boolean & { __phantom?: [T, E] };
253
+ type ChainIsErr<T, E> = () => boolean & { __phantom?: [T, E] };
254
+ type ChainIsOkAnd<T> = (fn: (value: T) => boolean) => boolean;
255
+ type ChainIsErrAnd<E> = (fn: (err: Err<E>) => boolean) => boolean;
256
+ type ChainOk<T> = () => T | null;
257
+ type ChainErr<E> = () => Err<E> | null;
258
+
259
+ type Chain<T, E> = {
260
+ result: Result<T, E>;
261
+ and: ChainAnd<T, E>;
262
+ andThen: ChainAndThen<T, E>;
263
+ map: ChainMap<T, E>;
264
+ mapErr: ChainMapErr<T, E>;
265
+ mapOr: ChainMapOr<T>;
266
+ mapOrElse: ChainMapOrElse<T, E>;
267
+ or: ChainOr<T, E>;
268
+ orElse: ChainOrElse<T, E>;
269
+ unwrap: ChainUnwrap<T>;
270
+ unwrapOr: ChainUnwrapOr<T>;
271
+ unwrapOrElse: ChainUnwrapOrElse<T, E>;
272
+ expect: ChainExpect<T>;
273
+ expectErr: ChainExpectErr<E>;
274
+ unwrapErr: ChainUnwrapErr<E>;
275
+ flatten: T extends Result<infer U, E> ? ChainFlatten<U, E> : never;
276
+ inspect: ChainInspect<T, E>;
277
+ inspectErr: ChainInspectErr<T, E>;
278
+ isOk: ChainIsOk<T, E>;
279
+ isErr: ChainIsErr<T, E>;
280
+ isOkAnd: ChainIsOkAnd<T>;
281
+ isErrAnd: ChainIsErrAnd<E>;
282
+ ok: ChainOk<T>;
283
+ err: ChainErr<E>;
284
+ };
285
+
286
+ export function chain<I, E>(initial: Result<I, E>): Chain<I, E> {
287
+ return {
288
+ result: initial,
289
+ and: (other) => chain(resultAnd(initial, other)),
290
+ andThen: (fn) => chain(resultAndThen(initial, fn)),
291
+ map: <O>(fn: (value: I) => O) => chain(resultMap(initial, fn)),
292
+ mapErr: <F>(fn: (err: Err<E>) => Err<F>) => chain(resultMapErr(initial, fn)),
293
+ mapOr: <R>(defaultValue: R, fn: (value: I) => R) => resultMapOr(initial, defaultValue, fn),
294
+ mapOrElse: <R>(defaultValue: (err: Err<E>) => R, fn: (value: I) => R) =>
295
+ resultMapOrElse(initial, defaultValue, fn),
296
+ or: (other) => chain(resultOr(initial, other)),
297
+ orElse: (fn) => chain(resultOrElse(initial, fn)),
298
+ unwrap: () => resultUnwrap(initial),
299
+ unwrapOr: (defaultValue) => resultUnwrapOr(initial, defaultValue),
300
+ unwrapOrElse: (fn) => resultUnwrapOrElse(initial, fn),
301
+ expect: (msg) => resultExpect(initial, msg),
302
+ expectErr: (msg) => resultExpectErr(initial, msg),
303
+ unwrapErr: () => resultUnwrapErr(initial),
304
+ flatten: (() => chain(resultFlatten(initial as any))) as any,
305
+ inspect: (fn) => chain(resultInspect(initial, fn)),
306
+ inspectErr: (fn) => chain(resultInspectErr(initial, fn)),
307
+ isOk: () => resultIsOk(initial),
308
+ isErr: () => resultIsErr(initial),
309
+ isOkAnd: (fn) => resultIsOkAnd(initial, fn),
310
+ isErrAnd: (fn) => resultIsErrAnd(initial, fn),
311
+ ok: () => resultOk(initial),
312
+ err: () => resultErr(initial),
313
+ };
314
+ }
package/package.json ADDED
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "@iahuang/result-ts",
3
+ "version": "1.0.0",
4
+ "description": "A Typescript implementation of Rust's [`std::result::Result`](https://doc.rust-lang.org/std/result/enum.Result.html) enum type. Make errors in fallible subroutines predictable and impossible to ignore.",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "test": "echo \"Error: no test specified\" && exit 1",
9
+ "build": "tsc"
10
+ },
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/iahuang/result-ts.git"
14
+ },
15
+ "author": "",
16
+ "license": "MIT",
17
+ "bugs": {
18
+ "url": "https://github.com/iahuang/result-ts/issues"
19
+ },
20
+ "homepage": "https://github.com/iahuang/result-ts#readme"
21
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,18 @@
1
+ {
2
+ "compilerOptions": {
3
+ "module": "ESNext",
4
+ "esModuleInterop": true,
5
+ "forceConsistentCasingInFileNames": true,
6
+ "strict": true,
7
+ "skipLibCheck": true,
8
+ "lib": ["ESNext"],
9
+ "outDir": "./dist",
10
+ "declaration": true,
11
+ "declarationMap": true,
12
+ "sourceMap": true,
13
+ "declarationDir": "./dist"
14
+ },
15
+ "$schema": "https://www.schemastore.org/tsconfig",
16
+ "include": ["index.ts"],
17
+ "exclude": ["node_modules", "dist"]
18
+ }