@onrails/result 0.3.1 → 0.4.1

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.
Files changed (73) hide show
  1. package/DESIGN.md +4 -3
  2. package/README.md +166 -13
  3. package/RECIPES.md +6 -4
  4. package/dist/async-fns.cjs +52 -0
  5. package/dist/async-fns.cjs.map +1 -0
  6. package/dist/async-fns.d.cts +143 -0
  7. package/dist/async-fns.d.ts +143 -0
  8. package/dist/async-fns.js +42 -0
  9. package/dist/async-fns.js.map +1 -0
  10. package/dist/async-lift.d.cts +109 -0
  11. package/dist/async-lift.d.ts +109 -0
  12. package/dist/{async-Ci6WSL5-.d.ts → async.d.cts} +42 -58
  13. package/dist/{async-DcXR7k9K.d.cts → async.d.ts} +42 -58
  14. package/dist/collections.d.cts +105 -0
  15. package/dist/collections.d.ts +105 -0
  16. package/dist/compat/neverthrow.cjs +57 -45
  17. package/dist/compat/neverthrow.cjs.map +1 -1
  18. package/dist/compat/neverthrow.d.cts +21 -24
  19. package/dist/compat/neverthrow.d.ts +21 -24
  20. package/dist/compat/neverthrow.js +56 -44
  21. package/dist/compat/neverthrow.js.map +1 -1
  22. package/dist/extra.cjs +3 -1
  23. package/dist/extra.cjs.map +1 -1
  24. package/dist/extra.d.cts +11 -14
  25. package/dist/extra.d.ts +11 -14
  26. package/dist/extra.js +3 -1
  27. package/dist/extra.js.map +1 -1
  28. package/dist/fluent.cjs +15 -28
  29. package/dist/fluent.cjs.map +1 -1
  30. package/dist/fluent.d.cts +4 -34
  31. package/dist/fluent.d.ts +4 -34
  32. package/dist/fluent.js +16 -28
  33. package/dist/fluent.js.map +1 -1
  34. package/dist/index.cjs +77 -52
  35. package/dist/index.cjs.map +1 -1
  36. package/dist/index.d.cts +28 -490
  37. package/dist/index.d.ts +28 -490
  38. package/dist/index.js +77 -53
  39. package/dist/index.js.map +1 -1
  40. package/dist/internal/ctor.d.cts +12 -0
  41. package/dist/internal/ctor.d.ts +12 -0
  42. package/dist/internal/dual.d.cts +42 -0
  43. package/dist/internal/dual.d.ts +42 -0
  44. package/dist/internal/infer.d.cts +40 -0
  45. package/dist/internal/infer.d.ts +40 -0
  46. package/dist/internal/lock.d.cts +16 -0
  47. package/dist/internal/lock.d.ts +16 -0
  48. package/dist/internal/to-error.d.cts +2 -0
  49. package/dist/internal/to-error.d.ts +2 -0
  50. package/dist/pipe.cjs +8 -0
  51. package/dist/pipe.cjs.map +1 -1
  52. package/dist/pipe.d.cts +58 -11
  53. package/dist/pipe.d.ts +58 -11
  54. package/dist/pipe.js +8 -1
  55. package/dist/pipe.js.map +1 -1
  56. package/dist/railway.cjs +87 -63
  57. package/dist/railway.cjs.map +1 -1
  58. package/dist/railway.d.cts +49 -19
  59. package/dist/railway.d.ts +49 -19
  60. package/dist/railway.js +87 -63
  61. package/dist/railway.js.map +1 -1
  62. package/dist/result.d.cts +315 -0
  63. package/dist/result.d.ts +315 -0
  64. package/dist/try-gen.cjs +3 -3
  65. package/dist/try-gen.cjs.map +1 -1
  66. package/dist/try-gen.d.cts +4 -7
  67. package/dist/try-gen.d.ts +4 -7
  68. package/dist/try-gen.js +3 -3
  69. package/dist/try-gen.js.map +1 -1
  70. package/dist/{types-BQ9vv0nD.d.cts → types.d.cts} +6 -8
  71. package/dist/{types-BQ9vv0nD.d.ts → types.d.ts} +6 -8
  72. package/package.json +69 -24
  73. package/skills/railway-do-notation/SKILL.md +9 -9
@@ -1,3 +1,13 @@
1
+ // src/internal/ctor.ts
2
+ var mkOk = (value) => ({
3
+ _tag: "Ok",
4
+ value
5
+ });
6
+ var mkErr = (error) => ({
7
+ _tag: "Err",
8
+ error
9
+ });
10
+
1
11
  // src/internal/dual.ts
2
12
  var dual = (arity, body) => {
3
13
  const run = body;
@@ -6,38 +16,34 @@ var dual = (arity, body) => {
6
16
  };
7
17
 
8
18
  // src/result.ts
9
- var ok = (value) => ({
10
- _tag: "Ok",
11
- value
12
- });
13
- var err = (error) => ({
14
- _tag: "Err",
15
- error
16
- });
17
19
  var isOk = (result) => result._tag === "Ok";
18
20
  var isErr = (result) => result._tag === "Err";
19
21
  var map = dual(
20
22
  2,
21
- (result, fn) => isOk(result) ? ok(fn(result.value)) : err(result.error)
23
+ (result, fn) => isOk(result) ? mkOk(fn(result.value)) : mkErr(result.error)
22
24
  );
23
25
  var mapErr = dual(
24
26
  2,
25
- (result, fn) => isErr(result) ? err(fn(result.error)) : ok(result.value)
27
+ (result, fn) => isErr(result) ? mkErr(fn(result.error)) : mkOk(result.value)
28
+ );
29
+ var bimap = dual(
30
+ 3,
31
+ (result, onOk, onErr) => isOk(result) ? mkOk(onOk(result.value)) : mkErr(onErr(result.error))
26
32
  );
27
33
  var flatMap = dual(
28
34
  2,
29
- (result, fn) => isOk(result) ? fn(result.value) : err(result.error)
35
+ (result, fn) => isOk(result) ? fn(result.value) : mkErr(result.error)
30
36
  );
31
37
  var unwrapOr = dual(
32
38
  2,
33
39
  (result, defaultValue) => isOk(result) ? result.value : defaultValue
34
40
  );
35
- function trySync(fn, onThrow) {
41
+ function fromThrowable(fn, onThrow) {
36
42
  return (...args) => {
37
43
  try {
38
- return ok(fn(...args));
44
+ return mkOk(fn(...args));
39
45
  } catch (error) {
40
- return err(onThrow(error));
46
+ return mkErr(onThrow(error));
41
47
  }
42
48
  };
43
49
  }
@@ -57,11 +63,11 @@ var sequenceSettled = (settled) => {
57
63
  const values = [];
58
64
  for (const result of settled) {
59
65
  if (isErr(result)) {
60
- return err(result.error);
66
+ return mkErr(result.error);
61
67
  }
62
68
  values.push(result.value);
63
69
  }
64
- return ok(values);
70
+ return mkOk(values);
65
71
  };
66
72
  var ResultAsync = class _ResultAsync {
67
73
  constructor(run) {
@@ -98,9 +104,9 @@ var ResultAsync = class _ResultAsync {
98
104
  static fromPromise(promise, onReject) {
99
105
  return new _ResultAsync(async () => {
100
106
  try {
101
- return ok(await promise);
107
+ return mkOk(await promise);
102
108
  } catch (error) {
103
- return err(onReject(error));
109
+ return mkErr(onReject(error));
104
110
  }
105
111
  });
106
112
  }
@@ -114,7 +120,7 @@ var ResultAsync = class _ResultAsync {
114
120
  * ```
115
121
  */
116
122
  static fromSafePromise(promise) {
117
- return new _ResultAsync(async () => ok(await promise));
123
+ return new _ResultAsync(async () => mkOk(await promise));
118
124
  }
119
125
  /**
120
126
  * Defers work until {@link resolve}. Unlike {@link fromPromise}, the factory
@@ -132,21 +138,13 @@ var ResultAsync = class _ResultAsync {
132
138
  return new _ResultAsync(fn);
133
139
  }
134
140
  static ok(value) {
135
- return new _ResultAsync(async () => ok(value));
141
+ return new _ResultAsync(async () => mkOk(value));
136
142
  }
137
143
  static of(value) {
138
144
  return _ResultAsync.ok(value);
139
145
  }
140
- /**
141
- * Lifts an error into an `Err` async result.
142
- *
143
- * @example
144
- * ```ts
145
- * const r = ResultAsync.err({ kind: "not_found" as const });
146
- * ```
147
- */
148
146
  static err(error) {
149
- return new _ResultAsync(async () => err(error));
147
+ return new _ResultAsync(async () => mkErr(error));
150
148
  }
151
149
  /**
152
150
  * Lifts an existing `Promise<Result<T, E>>` (e.g. from interop code) into a
@@ -164,7 +162,7 @@ var ResultAsync = class _ResultAsync {
164
162
  try {
165
163
  return await promise;
166
164
  } catch (error) {
167
- return err(mapDefect(error));
165
+ return mkErr(mapDefect(error));
168
166
  }
169
167
  });
170
168
  }
@@ -186,11 +184,11 @@ var ResultAsync = class _ResultAsync {
186
184
  for (const ra of results) {
187
185
  const result = await ra.resolve();
188
186
  if (isErr(result)) {
189
- return err(result.error);
187
+ return mkErr(result.error);
190
188
  }
191
189
  values.push(result.value);
192
190
  }
193
- return ok(values);
191
+ return mkOk(values);
194
192
  });
195
193
  }
196
194
  /**
@@ -202,7 +200,7 @@ var ResultAsync = class _ResultAsync {
202
200
  *
203
201
  * @example
204
202
  * ```ts
205
- * const combined = ResultAsync.combineTuple([loadCfg(), loadCatalog()] as const);
203
+ * const combined = ResultAsync.combineTuple([loadCfg(), loadCatalog()]);
206
204
  * // ResultAsync<readonly [Cfg, Catalog], CfgError | CatalogError>
207
205
  * const r = await combined;
208
206
  * if (isOk(r)) {
@@ -210,7 +208,7 @@ var ResultAsync = class _ResultAsync {
210
208
  * }
211
209
  * ```
212
210
  */
213
- static combineTuple(results) {
211
+ static combineTuple(results, ..._guard) {
214
212
  return _ResultAsync.combine(
215
213
  results
216
214
  );
@@ -225,12 +223,14 @@ var ResultAsync = class _ResultAsync {
225
223
  * const combined = ResultAsync.combineTupleParallel([
226
224
  * loadProfile(id),
227
225
  * loadMetrics(id),
228
- * ] as const);
226
+ * ]);
229
227
  * ```
230
228
  */
231
- static combineTupleParallel(results) {
229
+ static combineTupleParallel(results, ..._guard) {
232
230
  return new _ResultAsync(
233
- async () => sequenceSettled(await Promise.all(results.map((ra) => ra.resolve())))
231
+ async () => sequenceSettled(
232
+ await Promise.all(results.map((ra) => ra.resolve()))
233
+ )
234
234
  );
235
235
  }
236
236
  /**
@@ -256,6 +256,18 @@ var ResultAsync = class _ResultAsync {
256
256
  mapErr(fn) {
257
257
  return new _ResultAsync(async () => mapErr(await this.resolve(), fn));
258
258
  }
259
+ /**
260
+ * Transforms both tracks in one step — the async mirror of the sync
261
+ * `bimap`. Exactly one of `onOk` / `onErr` runs.
262
+ *
263
+ * @example
264
+ * ```ts
265
+ * load(id).bimap(toDto, (e): AppError => ({ kind: "load", cause: e }));
266
+ * ```
267
+ */
268
+ bimap(onOk, onErr) {
269
+ return new _ResultAsync(async () => bimap(await this.resolve(), onOk, onErr));
270
+ }
259
271
  /**
260
272
  * Canonical bind — chains a step that itself returns a `ResultAsync` or sync
261
273
  * `Result`, short-circuiting on `Err`. Error types accumulate (`E | F`).
@@ -424,12 +436,12 @@ var ResultAsync = class _ResultAsync {
424
436
  var combine = (results) => {
425
437
  const values = [];
426
438
  for (const result of results) {
427
- if (isErr(result)) return err(result.error);
439
+ if (isErr(result)) return mkErr(result.error);
428
440
  values.push(result.value);
429
441
  }
430
- return ok(values);
442
+ return mkOk(values);
431
443
  };
432
- var combineTuple = (results) => (
444
+ var combineTuple = (results, ..._guard) => (
433
445
  // Runtime identical to combine; the cast restores per-index tuple types.
434
446
  combine(results)
435
447
  );
@@ -441,7 +453,7 @@ var CompatResult = class _CompatResult {
441
453
  }
442
454
  inner;
443
455
  static fromThrowable(fn, onThrow) {
444
- const wrapped = trySync(fn, onThrow);
456
+ const wrapped = fromThrowable(fn, onThrow);
445
457
  return (...args) => new _CompatResult(wrapped(...args));
446
458
  }
447
459
  static combine(results) {
@@ -496,8 +508,8 @@ var CompatResult = class _CompatResult {
496
508
  }
497
509
  };
498
510
  var Result = CompatResult;
499
- var ok2 = (value) => new CompatResult(ok(value));
500
- var err2 = (error) => new CompatResult(err(error));
511
+ var ok = (value) => new CompatResult(mkOk(value));
512
+ var err = (error) => new CompatResult(mkErr(error));
501
513
  var CompatResultAsync = class _CompatResultAsync {
502
514
  constructor(inner) {
503
515
  this.inner = inner;
@@ -620,6 +632,6 @@ var errAsync = CompatResultAsync.err;
620
632
  var fromPromise = CompatResultAsync.fromPromise;
621
633
  var fromSafePromise = CompatResultAsync.fromSafePromise;
622
634
 
623
- export { CompatResult, CompatResultAsync, Result, CompatResultAsync as ResultAsync, err2 as err, errAsync, fromPromise, fromSafePromise, ok2 as ok, okAsync };
635
+ export { CompatResult, CompatResultAsync, Result, CompatResultAsync as ResultAsync, err, errAsync, fromPromise, fromSafePromise, ok, okAsync };
624
636
  //# sourceMappingURL=neverthrow.js.map
625
637
  //# sourceMappingURL=neverthrow.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/internal/dual.ts","../../src/result.ts","../../src/types.ts","../../src/async.ts","../../src/collections.ts","../../src/compat/neverthrow.ts"],"names":["ok","err"],"mappings":"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","file":"neverthrow.js","sourcesContent":["/**\n * @onrails/result internal — owning module for the **dual-form idiom**.\n *\n * Every dual-form transform in this package (`map`, `flatMap`, `match`, …)\n * accepts either shape:\n *\n * data-first: `map(result, fn)` — full arity, runs immediately\n * curried: `map(fn)(result)` — arity minus the leading `self`, returns\n * a unary function awaiting the data\n *\n * {@link dual} is the single arity dispatcher those transforms derive from;\n * hand-rolled `args.length` checks are not allowed elsewhere.\n *\n * NOTE: a twin copy of this module lives at `packages/maybe/src/internal/dual.ts`\n * — keep the two in sync when editing.\n *\n * Internal only: not listed in package.json `exports` or tsup entries.\n */\n\n/**\n * Derive a dual-form (data-first / curried) function from a single\n * data-first `body`.\n *\n * When called with `args.length >= arity` the wrapper runs `body(...args)`\n * (data-first). With fewer arguments it returns `(self) => body(self, ...args)`\n * — the curried, data-last-`self` form used with `pipe`/`flow`.\n *\n * The public type is supplied entirely by the caller: annotate the exported\n * const with the exact overload set and let `F` be inferred from it.\n *\n * @example\n * ```ts\n * export const map: {\n * <T, U, E>(result: Result<T, E>, fn: (value: T) => U): Result<U, E>;\n * <T, U>(fn: (value: T) => U): <E>(result: Result<T, E>) => Result<U, E>;\n * } = dual(\n * 2,\n * <T, U, E>(result: Result<T, E>, fn: (value: T) => U): Result<U, E> =>\n * isOk(result) ? ok(fn(result.value)) : err(result.error),\n * );\n * ```\n */\nexport const dual = <F>(arity: number, body: (...args: never[]) => unknown): F => {\n // `(...args: never[]) => unknown` is the top function type, so every typed\n // body is assignable to the parameter — but it cannot be invoked with\n // `unknown` arguments. Re-view it through the variadic shape the dispatcher\n // actually forwards; the constraint is that `body` only ever receives the\n // arguments the caller's overload annotation admitted.\n const run = body as (...args: readonly unknown[]) => unknown;\n const dispatcher = (...args: readonly unknown[]): unknown =>\n args.length >= arity ? run(...args) : (self: unknown) => run(self, ...args);\n // The caller's overload annotation on the exported const supplies the real\n // public type; internally the dispatcher stays `unknown`-typed.\n return dispatcher as F;\n};\n","import { dual } from \"./internal/dual.js\";\nimport type { Err, Ok, Result } from \"./types.js\";\n\nexport type { Err, Ok, Result } from \"./types.js\";\n\n/**\n * Lifts a value into the success track.\n *\n * @example\n * ```ts\n * const r = ok(42); // Result<number, never>\n * const typed: Result<number, \"parse\"> = ok(1);\n * ```\n */\nexport const ok = <T, E = never>(value: T): Result<T, E> => ({\n _tag: \"Ok\",\n value,\n});\n\n/**\n * Fantasy Land `pure` — alias of {@link ok}. One lift name shared across the\n * trio (`of` / `Maybe.of` / `ResultAsync.of`) for generic and FL-style code.\n *\n * @example\n * ```ts\n * const r = of(42); // Result<number, never> — identical to ok(42)\n * ```\n */\nexport const of = ok;\n\n/**\n * Lifts a value into the error track.\n *\n * @example\n * ```ts\n * const r = err({ kind: \"parse\", message: \"bad json\" });\n * // Result<never, { kind: \"parse\"; message: string }>\n * ```\n */\nexport const err = <T = never, E = unknown>(error: E): Result<T, E> => ({\n _tag: \"Err\",\n error,\n});\n\n/**\n * Type-narrowing predicate: returns `true` when the result is `Ok`.\n *\n * @example\n * ```ts\n * if (isOk(r)) {\n * console.log(r.value); // narrowed to Ok branch\n * }\n * ```\n */\nexport const isOk = <T, E>(result: Result<T, E>): result is Ok<T, E> => result._tag === \"Ok\";\n\n/**\n * Type-narrowing predicate: returns `true` when the result is `Err`.\n *\n * @example\n * ```ts\n * if (isErr(r)) {\n * metrics.inc(\"error\", { kind: r.error.kind });\n * }\n * ```\n */\nexport const isErr = <T, E>(result: Result<T, E>): result is Err<T, E> => result._tag === \"Err\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Dual-form helpers — each export accepts either shape:\n// data-first: `map(result, fn)`\n// curried: `map(fn)(result)`\n// Arity dispatch is derived from the internal `dual` combinator\n// (src/internal/dual.ts); the const annotation carries the public overloads.\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Transform the `Ok` value, passing `Err` through unchanged. Dual-form:\n * call data-first or curried (for use with {@link pipe}).\n *\n * @example\n * ```ts\n * map(ok(2), (n) => n * 3); // Ok 6 — data-first\n * pipe(ok(\"x\"), map((s) => s.length));// Ok 1 — curried\n * ```\n */\nexport const map: {\n <T, U, E>(result: Result<T, E>, fn: (value: T) => U): Result<U, E>;\n <T, U>(fn: (value: T) => U): <E>(result: Result<T, E>) => Result<U, E>;\n} = dual(\n 2,\n <T, U, E>(result: Result<T, E>, fn: (value: T) => U): Result<U, E> =>\n isOk(result) ? ok(fn(result.value)) : err(result.error),\n);\n\n/**\n * Transform the `Err` value, passing `Ok` through unchanged. Useful for\n * unifying heterogeneous failure types into one app-level union.\n *\n * @example\n * ```ts\n * type AppError = { kind: \"http\"; status: number } | { kind: \"parse\" };\n * pipe(\n * fetchSync(url), // Result<Body, { status: number }>\n * mapErr((e): AppError => ({ kind: \"http\", status: e.status })),\n * );\n * ```\n */\nexport const mapErr: {\n <T, E, F>(result: Result<T, E>, fn: (error: E) => F): Result<T, F>;\n <E, F>(fn: (error: E) => F): <T>(result: Result<T, E>) => Result<T, F>;\n} = dual(\n 2,\n <T, E, F>(result: Result<T, E>, fn: (error: E) => F): Result<T, F> =>\n isErr(result) ? err(fn(result.error)) : ok(result.value),\n);\n\n/**\n * Transform both tracks at once — `Ok` via `onOk`, `Err` via `onErr`.\n * Equivalent to `mapErr(onErr)(map(onOk)(result))` but in one pass.\n *\n * @example\n * ```ts\n * bimap(parsed, (cfg) => cfg.name, (e) => ({ kind: \"input\", cause: e }));\n * ```\n */\nexport const bimap: {\n <T, U, E, F>(result: Result<T, E>, onOk: (value: T) => U, onErr: (error: E) => F): Result<U, F>;\n <T, U, E, F>(\n onOk: (value: T) => U,\n onErr: (error: E) => F,\n ): (result: Result<T, E>) => Result<U, F>;\n} = dual(\n 3,\n <T, U, E, F>(\n result: Result<T, E>,\n onOk: (value: T) => U,\n onErr: (error: E) => F,\n ): Result<U, F> => (isOk(result) ? ok(onOk(result.value)) : err(onErr(result.error))),\n);\n\n/**\n * Canonical bind (Fantasy Land `chain`). Chains a Result-returning step,\n * widening the error union to `E | F`. Short-circuits on `Err`.\n *\n * @example\n * ```ts\n * flatMap(parseInput(raw), (data) =>\n * data.id != null ? ok(data) : err({ kind: \"missing_id\" as const }),\n * );\n * // Result<Data, ParseError | { kind: \"missing_id\" }>\n * ```\n */\nexport const flatMap: {\n <T, U, E, F>(result: Result<T, E>, fn: (value: T) => Result<U, F>): Result<U, E | F>;\n <T, U, F>(fn: (value: T) => Result<U, F>): <E>(result: Result<T, E>) => Result<U, E | F>;\n} = dual(\n 2,\n <T, U, E, F>(result: Result<T, E>, fn: (value: T) => Result<U, F>): Result<U, E | F> =>\n isOk(result) ? fn(result.value) : err(result.error),\n);\n\n/**\n * Error-track bind — runs `fn` only when the result is `Err`, allowing\n * a failed workflow to recover to `Ok` or remap the failure. Mirror of\n * {@link flatMap} on the error channel.\n *\n * @example\n * ```ts\n * recover(networkResult, (e) =>\n * e.kind === \"rate_limit\" ? ok(cachedBody) : err(e),\n * );\n * ```\n */\nexport const recover: {\n <T, E, F>(result: Result<T, E>, fn: (error: E) => Result<T, F>): Result<T, F>;\n <T, E, F>(fn: (error: E) => Result<T, F>): (result: Result<T, E>) => Result<T, F>;\n} = dual(\n 2,\n <T, E, F>(result: Result<T, E>, fn: (error: E) => Result<T, F>): Result<T, F> =>\n isErr(result) ? fn(result.error) : ok(result.value),\n);\n\n/**\n * Observe the `Ok` value for side effects (logging, metrics) without\n * changing the carried value. Passes `Err` through untouched.\n *\n * @example\n * ```ts\n * pipe(\n * parseConfig(raw),\n * tap((cfg) => log.info({ msg: \"parsed\", name: cfg.name })),\n * flatMap(validate),\n * );\n * ```\n */\nexport const tap: {\n <T, E>(result: Result<T, E>, fn: (value: T) => void): Result<T, E>;\n <T>(fn: (value: T) => void): <E>(result: Result<T, E>) => Result<T, E>;\n} = dual(2, <T, E>(result: Result<T, E>, fn: (value: T) => void): Result<T, E> => {\n if (isOk(result)) fn(result.value);\n return result;\n});\n\n/**\n * Observe the `Err` value for side effects (logging, metrics) without\n * changing the carried error. Passes `Ok` through untouched.\n *\n * @example\n * ```ts\n * pipe(\n * loadUser(id),\n * tapErr((e) => metrics.inc(\"user.load.fail\", { kind: e.kind })),\n * );\n * ```\n */\nexport const tapErr: {\n <T, E>(result: Result<T, E>, fn: (error: E) => void): Result<T, E>;\n <E>(fn: (error: E) => void): <T>(result: Result<T, E>) => Result<T, E>;\n} = dual(2, <T, E>(result: Result<T, E>, fn: (error: E) => void): Result<T, E> => {\n if (isErr(result)) fn(result.error);\n return result;\n});\n\n/**\n * Terminal collapse — fold both tracks into a single value. Dual-form:\n * 3-args data-first, 2-args curried for {@link pipe}. Returns whatever\n * the handlers return.\n *\n * For files that also import `match` from `ts-pattern`, use a namespace\n * import (`import * as R from \"@onrails/result\"` → `R.match`) to dissolve\n * the collision.\n *\n * @example\n * ```ts\n * const html = match(parsed, (cfg) => render(cfg), (e) => renderError(e));\n * ```\n */\nexport const match: {\n <T, E, U>(result: Result<T, E>, onOk: (value: T) => U, onErr: (error: E) => U): U;\n <T, E, U>(onOk: (value: T) => U, onErr: (error: E) => U): (result: Result<T, E>) => U;\n} = dual(\n 3,\n <T, E, U>(result: Result<T, E>, onOk: (value: T) => U, onErr: (error: E) => U): U =>\n isOk(result) ? onOk(result.value) : onErr(result.error),\n);\n\n/**\n * Returns the `Ok` value, or `defaultValue` when the result is `Err`.\n *\n * @example\n * ```ts\n * unwrapOr(parsedSetting, \"default-value\");\n * ```\n */\nexport const unwrapOr: {\n <T, E>(result: Result<T, E>, defaultValue: T): T;\n <T>(defaultValue: T): <E>(result: Result<T, E>) => T;\n} = dual(\n 2,\n <T, E>(result: Result<T, E>, defaultValue: T): T => (isOk(result) ? result.value : defaultValue),\n);\n\n/**\n * Test/assert helper — returns the `Ok` value, or **throws the original `Err`\n * value** when called on an `Err`. This is the assertion tier (RFC 0001 §4):\n * intended for `*.spec.ts` / `*.test.ts`, where throwing fails the test loudly.\n * In business logic prefer {@link match} or {@link unwrapOr}; the lint plugins\n * flag `unwrapOk` outside test files.\n *\n * @returns the unwrapped `Ok` value\n * @throws the carried `Err` value when the result is `Err`\n *\n * @example\n * ```ts\n * // in a *.spec.ts\n * expect(unwrapOk(ok(5))).toBe(5);\n * expect(() => unwrapOk(err(error))).toThrow(error);\n * ```\n */\nexport function unwrapOk<T, E>(result: Result<T, E>): T {\n if (isErr(result)) throw result.error;\n return result.value;\n}\n\n/** Alias of {@link unwrapOk} for syntax cohesion with `@onrails/maybe`. */\nexport const unwrap = unwrapOk;\n\n/**\n * Test/assert helper — returns the `Err` value, or **throws a `TypeError`**\n * when called on an `Ok`. Mirror of {@link unwrapOk} on the error track and\n * part of the same assertion tier (RFC 0001 §4): intended for `*.spec.ts` /\n * `*.test.ts`. Prefer {@link match} / {@link unwrapOr} in business logic; the\n * lint plugins flag `unwrapErr` outside test files.\n *\n * @returns the unwrapped `Err` value\n * @throws `TypeError` when the result is `Ok`\n *\n * @example\n * ```ts\n * // in a *.spec.ts\n * expect(unwrapErr(err(\"x\"))).toBe(\"x\");\n * expect(() => unwrapErr(ok(5))).toThrow(TypeError);\n * ```\n */\nexport function unwrapErr<T, E>(result: Result<T, E>): E {\n if (isOk(result)) throw new TypeError(\"unwrapErr called on Ok\");\n return result.error;\n}\n\n/**\n * Wraps a throwing sync function, returning a function that produces a\n * {@link Result} instead of throwing. Thrown errors pass through `onThrow` to\n * become a typed `Err`; a normal return becomes `Ok`. The neverthrow analogue\n * is `Result.fromThrowable`.\n *\n * @param fn - the throwing function to wrap\n * @param onThrow - maps a thrown value to the `Err` channel\n * @returns a function with `fn`'s parameters that returns `Result<ReturnType, E>`\n *\n * @example\n * ```ts\n * type ParseError = { kind: \"parse\"; message: string };\n * const parse = trySync(\n * JSON.parse,\n * (e): ParseError => ({ kind: \"parse\", message: String(e) }),\n * );\n * parse(\"{}\"); // Ok({})\n * parse(\"nope\"); // Err({ kind: \"parse\", … })\n * ```\n */\nexport function trySync<A extends readonly unknown[], T, E>(\n fn: (...args: A) => T,\n onThrow: (error: unknown) => E,\n): (...args: A) => Result<T, E>;\nexport function trySync<F extends (...args: never) => unknown, E>(\n fn: F,\n onThrow: (error: unknown) => E,\n): (...args: Parameters<F>) => Result<ReturnType<F>, E>;\nexport function trySync(\n fn: (...args: never) => unknown,\n onThrow: (error: unknown) => unknown,\n): (...args: never) => Result<unknown, unknown> {\n return (...args: never) => {\n try {\n return ok(fn(...args));\n } catch (error) {\n return err(onThrow(error));\n }\n };\n}\n\n/**\n * Variadic value-first pipe — threads `value` through up to nine unary fns,\n * left-to-right. Use {@link pipe} when you already have a starting value;\n * use {@link flow} to define a reusable composed function with no value yet.\n *\n * @example\n * ```ts\n * pipe(\n * parseConfig(raw),\n * map((cfg) => cfg.name),\n * flatMap((name) => (name ? ok(name) : err({ kind: \"empty\" as const }))),\n * tap(log),\n * );\n * ```\n */\nexport function pipe<A>(value: A): A;\nexport function pipe<A, B>(value: A, ab: (a: A) => B): B;\nexport function pipe<A, B, C>(value: A, ab: (a: A) => B, bc: (b: B) => C): C;\nexport function pipe<A, B, C, D>(value: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D): D;\nexport function pipe<A, B, C, D, E>(\n value: A,\n ab: (a: A) => B,\n bc: (b: B) => C,\n cd: (c: C) => D,\n de: (d: D) => E,\n): E;\nexport function pipe<A, B, C, D, E, F>(\n value: A,\n ab: (a: A) => B,\n bc: (b: B) => C,\n cd: (c: C) => D,\n de: (d: D) => E,\n ef: (e: E) => F,\n): F;\nexport function pipe<A, B, C, D, E, F, G>(\n value: A,\n ab: (a: A) => B,\n bc: (b: B) => C,\n cd: (c: C) => D,\n de: (d: D) => E,\n ef: (e: E) => F,\n fg: (f: F) => G,\n): G;\nexport function pipe<A, B, C, D, E, F, G, H>(\n value: A,\n ab: (a: A) => B,\n bc: (b: B) => C,\n cd: (c: C) => D,\n de: (d: D) => E,\n ef: (e: E) => F,\n fg: (f: F) => G,\n gh: (g: G) => H,\n): H;\nexport function pipe<A, B, C, D, E, F, G, H, I>(\n value: A,\n ab: (a: A) => B,\n bc: (b: B) => C,\n cd: (c: C) => D,\n de: (d: D) => E,\n ef: (e: E) => F,\n fg: (f: F) => G,\n gh: (g: G) => H,\n hi: (h: H) => I,\n): I;\nexport function pipe(value: unknown, ...fns: ReadonlyArray<(x: unknown) => unknown>): unknown {\n let acc = value;\n for (const fn of fns) {\n acc = fn(acc);\n }\n return acc;\n}\n\nconst printPayload = (payload: unknown): string => {\n try {\n return JSON.stringify(payload) ?? String(payload);\n } catch {\n // cyclic or non-JSON payload — a debug printer must not throw\n return String(payload);\n }\n};\n\n/**\n * Debug printer — renders a result as `Ok(…)` / `Err(…)` for logs. Payloads\n * print as JSON (values are plain data by design); non-JSON payloads fall\n * back to `String(...)`.\n *\n * @example\n * ```ts\n * show(ok(1)); // 'Ok(1)'\n * show(err({ kind: \"e\" })); // 'Err({\"kind\":\"e\"})'\n * ```\n */\nexport const show = <T, E>(result: Result<T, E>): string =>\n isOk(result) ? `Ok(${printPayload(result.value)})` : `Err(${printPayload(result.error)})`;\n","/**\n * The core railway type: a tagged union carrying either a success value\n * (`Ok<T>`) or a failure value (`Err<E>`). It is a plain discriminated union\n * on `_tag` — no classes — so it is immutable and tree-shake friendly. Narrow\n * with {@link isOk} / {@link isErr} to read `.value` / `.error`.\n *\n * @typeParam T - the `Ok` value type\n * @typeParam E - the `Err` error type\n *\n * @example\n * ```ts\n * function parse(raw: string): Result<number, \"nan\"> {\n * const n = Number(raw);\n * return Number.isNaN(n) ? err(\"nan\") : ok(n);\n * }\n * ```\n */\nexport type Result<T, E> =\n | { readonly _tag: \"Ok\"; readonly value: T }\n | { readonly _tag: \"Err\"; readonly error: E };\n\n/**\n * The success branch of a {@link Result} — `{ _tag: \"Ok\"; value: T }`.\n * The `E` parameter keeps the type assignable to `Result<T, E>`.\n */\nexport type Ok<T, E = never> = Extract<Result<T, E>, { _tag: \"Ok\" }>;\n\n/**\n * The failure branch of a {@link Result} — `{ _tag: \"Err\"; error: E }`.\n */\nexport type Err<T, E> = Extract<Result<T, E>, { _tag: \"Err\" }>;\n\n/**\n * Error subclass representing an **unexpected** defect — a thrown exception or\n * promise rejection that was not part of the modelled `Err` union. Used as the\n * default mapping when {@link fromAsync} is called without an `onDefect`\n * handler; the original cause is preserved on `.cause`.\n *\n * @example\n * ```ts\n * const defect = new UnexpectedError(\"Unexpected async defect\", caught);\n * defect.cause; // the original thrown value\n * ```\n */\nexport class UnexpectedError extends Error {\n constructor(\n message: string,\n override readonly cause?: unknown,\n ) {\n super(message);\n this.name = \"UnexpectedError\";\n }\n}\n","import type { InferErr, InferOk } from \"./internal/infer.js\";\nimport { err, isErr, map, mapErr, ok } from \"./result.js\";\nimport type { Result } from \"./types.js\";\nimport { UnexpectedError } from \"./types.js\";\n\ntype PromiseFactory<T, E> = () => Promise<Result<T, E>>;\ntype CombineTupleAsync<R extends readonly ResultAsync<unknown, unknown>[]> = ResultAsync<\n { [K in keyof R]: InferOk<R[K]> },\n { [K in keyof R]: InferErr<R[K]> }[number]\n>;\n\n/** Collapses settled results left-to-right, short-circuiting on the first `Err`. */\nconst sequenceSettled = (\n settled: readonly Result<unknown, unknown>[],\n): Result<unknown[], unknown> => {\n const values: unknown[] = [];\n for (const result of settled) {\n if (isErr(result)) {\n return err(result.error);\n }\n values.push(result.value);\n }\n return ok(values);\n};\n\n/**\n * Async railway carrier. Wraps a deferred `Promise<Result<T, E>>` and exposes\n * the same dual-track transforms as the sync {@link Result} — `map`, `flatMap`,\n * `recover`, `tap`, `match`. The public API never surfaces `Promise<Result<…>>`\n * directly: `await` the instance (it is thenable) or call {@link resolve} /\n * {@link match} to settle it.\n *\n * Construct via the static factories ({@link ok}, {@link err}, {@link fromPromise},\n * {@link defer}, …) rather than `new` — the constructor is `protected`.\n *\n * @typeParam T - the `Ok` value type\n * @typeParam E - the `Err` error type\n *\n * @example\n * ```ts\n * const user = ResultAsync.fromPromise(api.getUser(id), toAppError)\n * .map((u) => u.profile)\n * .recover(() => ResultAsync.ok(guestProfile));\n *\n * const r = await user; // Result<Profile, AppError>\n * ```\n */\nexport class ResultAsync<T, E> {\n private promise: Promise<Result<T, E>> | null = null;\n\n protected constructor(protected readonly run: PromiseFactory<T, E>) {}\n\n /**\n * Lifts an already-settled sync {@link Result} into a {@link ResultAsync}.\n *\n * @example\n * ```ts\n * const ra = ResultAsync.fromResult(ok(42)); // ResultAsync<number, never>\n * ```\n */\n static fromResult<T, E>(result: Result<T, E>): ResultAsync<T, E> {\n return new ResultAsync(async () => result);\n }\n\n /**\n * Wraps a `PromiseLike<T>` that may reject. Rejections pass through `onReject`\n * to become a typed `Err`; resolution becomes `Ok<T>`.\n *\n * @param promise - the promise to wrap\n * @param onReject - maps a rejection reason to the `Err` channel\n *\n * @example\n * ```ts\n * const body = ResultAsync.fromPromise(\n * fetch(url).then((r) => r.text()),\n * (e): NetError => ({ kind: \"net\", cause: String(e) }),\n * );\n * ```\n */\n static fromPromise<T, E>(\n promise: PromiseLike<T>,\n onReject: (error: unknown) => E,\n ): ResultAsync<T, E> {\n return new ResultAsync(async () => {\n try {\n return ok(await promise);\n } catch (error) {\n return err(onReject(error));\n }\n });\n }\n\n /**\n * Wraps a `PromiseLike<T>` that is **guaranteed not to reject**, skipping the\n * `onReject` mapper. Use only when rejection is provably impossible.\n *\n * @example\n * ```ts\n * const now = ResultAsync.fromSafePromise(Promise.resolve(Date.now()));\n * ```\n */\n static fromSafePromise<T, E = never>(promise: PromiseLike<T>): ResultAsync<T, E> {\n return new ResultAsync(async () => ok(await promise));\n }\n\n /**\n * Defers work until {@link resolve}. Unlike {@link fromPromise}, the factory\n * does not run until the `ResultAsync` is resolved (e.g. by `combineTuple` /\n * `combineTupleParallel`). The factory runs at most once — `resolve` memoizes.\n *\n * @example\n * ```ts\n * const insert = ResultAsync.defer(() => db.orders.insert(row));\n * // nothing has run yet\n * const r = await insert; // factory runs exactly once here\n * ```\n */\n static defer<T, E>(fn: () => Promise<Result<T, E>>): ResultAsync<T, E> {\n return new ResultAsync(fn);\n }\n\n /**\n * Lifts a value into an `Ok` async result.\n *\n * @example\n * ```ts\n * const r = ResultAsync.ok(42); // ResultAsync<number, never>\n * ```\n */\n static ok<T>(value: T): ResultAsync<T, never>;\n static ok<T, E>(value: T): ResultAsync<T, E>;\n static ok<T, E = never>(value: T): ResultAsync<T, E> {\n return new ResultAsync(async () => ok(value));\n }\n\n /**\n * Fantasy Land `pure` — alias of {@link ResultAsync.ok}. One lift name\n * shared across the trio (`of` / `Maybe.of` / `ResultAsync.of`).\n */\n static of<T>(value: T): ResultAsync<T, never>;\n static of<T, E>(value: T): ResultAsync<T, E>;\n static of<T, E = never>(value: T): ResultAsync<T, E> {\n return ResultAsync.ok(value);\n }\n\n /**\n * Lifts an error into an `Err` async result.\n *\n * @example\n * ```ts\n * const r = ResultAsync.err({ kind: \"not_found\" as const });\n * ```\n */\n static err<T = never, E = unknown>(error: E): ResultAsync<T, E> {\n return new ResultAsync(async () => err(error));\n }\n\n /**\n * Lifts an existing `Promise<Result<T, E>>` (e.g. from interop code) into a\n * {@link ResultAsync}. A thrown defect is routed through `onDefect`,\n * defaulting to {@link UnexpectedError}. The `Ok` value passes through\n * verbatim — even when it happens to be Result-shaped.\n *\n * @param promise - a promise that already yields a `Result`\n * @param onDefect - maps an unexpected throw to the `Err` channel\n * @see {@link fromAsync} from `@onrails/result`\n */\n static fromResultPromise<T, E>(\n promise: Promise<Result<T, E>>,\n onDefect?: (error: unknown) => E | UnexpectedError,\n ): ResultAsync<T, E | UnexpectedError> {\n const mapDefect =\n onDefect ?? ((error: unknown) => new UnexpectedError(\"Unexpected async defect\", error));\n return new ResultAsync<T, E | UnexpectedError>(async () => {\n try {\n return await promise;\n } catch (error) {\n return err(mapDefect(error));\n }\n });\n }\n\n /**\n * Combines a homogeneous array of async results into one. Resolves\n * **sequentially** in input order, short-circuiting on the first `Err`.\n * For heterogeneous tuples that preserve per-index types, use\n * {@link combineTuple}; for wall-clock overlap, {@link combineTupleParallel}.\n *\n * @example\n * ```ts\n * const all = ResultAsync.combine([loadA(), loadB(), loadC()]);\n * // ResultAsync<Item[], LoadError>\n * ```\n */\n static combine<T, E>(results: readonly ResultAsync<T, E>[]): ResultAsync<T[], E> {\n return new ResultAsync(async () => {\n const values: T[] = [];\n for (const ra of results) {\n const result = await ra.resolve();\n if (isErr(result)) {\n return err(result.error);\n }\n values.push(result.value);\n }\n return ok(values);\n });\n }\n\n /**\n * Heterogeneous async tuple combine — resolves branches **sequentially**\n * (left-to-right), returning the first `Err` in input order. Preserves each\n * branch's `Ok` type by position, so the result destructures type-safely.\n * This is the canonical sequential async combine (replaces the former\n * `sequenceTupleAsync`).\n *\n * @example\n * ```ts\n * const combined = ResultAsync.combineTuple([loadCfg(), loadCatalog()] as const);\n * // ResultAsync<readonly [Cfg, Catalog], CfgError | CatalogError>\n * const r = await combined;\n * if (isOk(r)) {\n * const [cfg, catalog] = r.value; // typed per position\n * }\n * ```\n */\n static combineTuple<const R extends readonly ResultAsync<unknown, unknown>[]>(\n results: R,\n ): CombineTupleAsync<R> {\n // Runtime identical to combine; the cast restores per-index tuple types.\n return ResultAsync.combine(\n results as readonly ResultAsync<unknown, unknown>[],\n ) as CombineTupleAsync<R>;\n }\n\n /**\n * Like {@link combineTuple}, but starts every branch before awaiting (wall-clock\n * parallel for independent IO). On failure, returns the first `Err` in input order.\n *\n * @example\n * ```ts\n * // independent IO — overlap them\n * const combined = ResultAsync.combineTupleParallel([\n * loadProfile(id),\n * loadMetrics(id),\n * ] as const);\n * ```\n */\n static combineTupleParallel<const R extends readonly ResultAsync<unknown, unknown>[]>(\n results: R,\n ): CombineTupleAsync<R> {\n // Cast restores per-index tuple types over the untyped sequence core.\n return new ResultAsync(async () =>\n sequenceSettled(await Promise.all(results.map((ra) => ra.resolve()))),\n ) as CombineTupleAsync<R>;\n }\n\n /**\n * Transforms the `Ok` value, passing `Err` through unchanged.\n *\n * @example\n * ```ts\n * ResultAsync.ok(2).map((n) => n * 3); // ResultAsync<number> → Ok 6\n * ```\n */\n map<U>(fn: (value: T) => U): ResultAsync<U, E> {\n return new ResultAsync(async () => map(await this.resolve(), fn));\n }\n\n /**\n * Transforms the `Err` value, passing `Ok` through unchanged — useful for\n * unifying heterogeneous failures into one app-level union.\n *\n * @example\n * ```ts\n * load(id).mapErr((e): AppError => ({ kind: \"load\", cause: e })); // ResultAsync<T, AppError>\n * ```\n */\n mapErr<F>(fn: (error: E) => F): ResultAsync<T, F> {\n return new ResultAsync(async () => mapErr(await this.resolve(), fn));\n }\n\n /**\n * Canonical bind — chains a step that itself returns a `ResultAsync` or sync\n * `Result`, short-circuiting on `Err`. Error types accumulate (`E | F`).\n *\n * @example\n * ```ts\n * authenticate(req)\n * .flatMap((user) => loadProfile(user.id)) // ResultAsync\n * .flatMap((p) => validate(p)); // sync Result also accepted\n * ```\n */\n flatMap<U, F = E>(fn: (value: T) => ResultAsync<U, F> | Result<U, F>): ResultAsync<U, E | F> {\n return new ResultAsync<U, E | F>(async () => {\n const first = await this.resolve();\n if (isErr(first)) {\n return first;\n }\n const next = fn(first.value);\n return next instanceof ResultAsync ? next.resolve() : next;\n });\n }\n\n /**\n * neverthrow-compat alias of {@link flatMap}. Kept as the documented compat\n * tier; prefer {@link flatMap} in new code.\n *\n * @example\n * ```ts\n * authenticate(req).andThen((user) => loadProfile(user.id));\n * ```\n */\n andThen<U, F = E>(fn: (value: T) => ResultAsync<U, F> | Result<U, F>): ResultAsync<U, E | F> {\n return this.flatMap(fn);\n }\n\n /**\n * Error-channel bind — runs `fn` only on `Err`, swapping in a recovery\n * `ResultAsync` or sync `Result`. `Ok` passes through. The mirror of\n * {@link flatMap} on the error track.\n *\n * @example\n * ```ts\n * loadFromCache(id).recover(() => loadFromOrigin(id)); // ResultAsync<T, F>\n * ```\n */\n recover<F>(fn: (error: E) => ResultAsync<T, F> | Result<T, F>): ResultAsync<T, F> {\n return new ResultAsync<T, F>(async () => {\n const first = await this.resolve();\n if (!isErr(first)) {\n return first;\n }\n const next = fn(first.error);\n return next instanceof ResultAsync ? next.resolve() : next;\n });\n }\n\n /**\n * neverthrow-compat alias of {@link recover}. Kept as the documented compat\n * tier; prefer {@link recover} in new code.\n *\n * @example\n * ```ts\n * loadFromCache(id).orElse(() => loadFromOrigin(id));\n * ```\n */\n orElse<F>(fn: (error: E) => ResultAsync<T, F> | Result<T, F>): ResultAsync<T, F> {\n return this.recover(fn);\n }\n\n /**\n * Runs a side effect on the `Ok` value and passes the result through\n * unchanged; a no-op on `Err`. Mirrors {@link tapErr}.\n *\n * @example\n * ```ts\n * saveUser(u).tap((saved) => analytics.track(\"user_saved\", saved.id));\n * ```\n */\n tap(fn: (value: T) => void): ResultAsync<T, E> {\n return new ResultAsync(async () => {\n const result = await this.resolve();\n if (!isErr(result)) {\n fn(result.value);\n }\n return result;\n });\n }\n\n /**\n * Runs a side effect on the `Err` value and passes the result through\n * unchanged; a no-op on `Ok`. The error-track mirror of {@link tap}.\n *\n * @example\n * ```ts\n * saveUser(u).tapErr((e) => logger.warn(\"save failed\", e));\n * ```\n */\n tapErr(fn: (error: E) => void): ResultAsync<T, E> {\n return new ResultAsync(async () => {\n const result = await this.resolve();\n if (isErr(result)) {\n fn(result.error);\n }\n return result;\n });\n }\n\n /**\n * Settles to the `Ok` value, or `defaultValue` if `Err`. Terminal — returns a\n * plain `Promise`, not a `ResultAsync`.\n *\n * @example\n * ```ts\n * const profile = await loadProfile(id).unwrapOr(guestProfile);\n * ```\n */\n unwrapOr<U>(defaultValue: U): Promise<T | U> {\n return this.resolve().then((result) => (isErr(result) ? defaultValue : result.value));\n }\n\n /**\n * Terminal collapse — folds both tracks into a single awaited value. Returns\n * a plain `Promise`, settling the carrier exactly once.\n *\n * @param onOk - handles the `Ok` value\n * @param onErr - handles the `Err` value\n *\n * @example\n * ```ts\n * const status = await save(row).match(\n * () => 200,\n * (e) => (e.kind === \"conflict\" ? 409 : 500),\n * );\n * ```\n */\n match<U1, U2 = U1>(onOk: (value: T) => U1, onErr: (error: E) => U2): Promise<U1 | U2> {\n return this.resolve().then((result) =>\n isErr(result) ? onErr(result.error) : onOk(result.value),\n );\n }\n\n /**\n * Settles the carrier to a bare sync {@link Result}, memoizing so the\n * underlying factory runs at most once. Prefer `await ra` (the thenable) or\n * {@link match} in app code; use `resolve` when you need the tagged union back.\n *\n * @example\n * ```ts\n * const r = await load(id).resolve(); // Result<Data, LoadError>\n * if (isOk(r)) use(r.value);\n * ```\n */\n resolve(): Promise<Result<T, E>> {\n if (!this.promise) {\n this.promise = this.run();\n }\n return this.promise;\n }\n\n /**\n * Thenable shim — `await ra` resolves to a bare tagged-union `Result<T, E>`.\n * Narrow with `isOk(r)` / `isErr(r)` to read `.value` / `.error`.\n */\n // biome-ignore lint/suspicious/noThenProperty: makes ResultAsync awaitable\n then<R1 = Result<T, E>, R2 = never>(\n onfulfilled?: ((value: Result<T, E>) => R1 | PromiseLike<R1>) | undefined | null,\n onrejected?: ((reason: unknown) => R2 | PromiseLike<R2>) | undefined | null,\n ): Promise<R1 | R2> {\n return this.resolve().then(\n // Safe: without onfulfilled, R1 stays at its Result<T, E> default.\n (r) => (onfulfilled ? onfulfilled(r) : (r as unknown as R1)),\n onrejected ?? undefined,\n );\n }\n}\n\n/**\n * The free-function lift helpers (`okAsync`, `errAsync`, `fromPromise`,\n * `fromSafePromise`, `fromResult`, `fromAsync`, `asyncAfter`, `tryAsync`)\n * live in `./async-lift.ts` and are re-exported from the package index.\n */\n","/**\n * @onrails/result — sync aggregation, one module, two axes:\n *\n * short-circuit (first `Err` wins) — {@link combine} / {@link combineTuple}\n * accumulate expected failures — {@link validateAll} / {@link validateTuple}\n *\n * The accumulate pair collects every failure into a readonly array by\n * default, or folds them with an explicit `combineErrors` when given one.\n */\n\nimport type { InferErr, InferOk } from \"./internal/infer.js\";\nimport { err, isErr, ok } from \"./result.js\";\nimport type { Result } from \"./types.js\";\n\n/**\n * Combines a homogeneous array of results into a single result holding an\n * array of the `Ok` values, in input order. Short-circuits on the first `Err`\n * (first failure wins). For heterogeneous tuples that preserve per-index\n * types, use {@link combineTuple}.\n *\n * @example\n * ```ts\n * combine([ok(1), ok(2)]); // Ok([1, 2])\n * combine([ok(1), err(\"e\")]); // Err(\"e\")\n * ```\n */\nexport const combine = <T, E>(results: readonly Result<T, E>[]): Result<T[], E> => {\n const values: T[] = [];\n for (const result of results) {\n if (isErr(result)) return err(result.error);\n values.push(result.value);\n }\n return ok(values);\n};\n\ntype CombineTuple<R extends readonly Result<unknown, unknown>[]> = Result<\n { [K in keyof R]: InferOk<R[K]> },\n { [K in keyof R]: InferErr<R[K]> }[number]\n>;\n\n/**\n * Heterogeneous tuple combine — like {@link combine} but preserves each\n * branch's `Ok` type by position, so the result destructures type-safely.\n * Short-circuits on the first `Err` in input order (neverthrow-style).\n *\n * @example\n * ```ts\n * const r = combineTuple([ok(1), ok(\"x\")] as const);\n * // Result<readonly [number, string], never>\n * if (isOk(r)) {\n * const [n, s] = r.value; // typed per position\n * }\n * ```\n */\nexport const combineTuple = <const R extends readonly Result<unknown, unknown>[]>(\n results: R,\n): CombineTuple<R> =>\n // Runtime identical to combine; the cast restores per-index tuple types.\n combine(results as readonly Result<unknown, unknown>[]) as CombineTuple<R>;\n\n/**\n * Accumulate independent validation failures. Returns `Ok<T[]>` only when\n * every input is `Ok`. Without a combiner, failures are collected into a\n * readonly array; with `combineErrors` they are folded into a single `E`.\n *\n * Unlike {@link combine}, this does **not** short-circuit on first failure —\n * use for independent checks where you want to report all problems at once.\n *\n * @example\n * ```ts\n * const checks: Result<string, string[]>[] = [ok(\"Ada\"), err([\"age required\"])];\n *\n * validateAll(checks);\n * // Result<string[], readonly string[][]>\n *\n * validateAll(checks, (left, right) => [...left, ...right]);\n * // Result<string[], string[]>\n * ```\n */\nexport function validateAll<T, E>(results: readonly Result<T, E>[]): Result<T[], readonly E[]>;\nexport function validateAll<T, E>(\n results: readonly Result<T, E>[],\n combineErrors: (left: E, right: E) => E,\n): Result<T[], E>;\nexport function validateAll<T, E>(\n results: readonly Result<T, E>[],\n combineErrors?: (left: E, right: E) => E,\n): Result<T[], E | readonly E[]> {\n const values: T[] = [];\n const errors: E[] = [];\n\n for (const result of results) {\n if (isErr(result)) {\n errors.push(result.error);\n } else {\n values.push(result.value);\n }\n }\n\n if (errors.length === 0) return ok(values);\n return err(combineErrors ? errors.reduce(combineErrors) : errors);\n}\n\n/**\n * Tuple-preserving variant of {@link validateAll}. Heterogeneous input tuple\n * → preserved `Ok` tuple shape. Without a combiner, the error union is\n * collected into a readonly array; with `combineErrors`, all inputs must\n * share the error type `E` and failures fold into a single `E`.\n *\n * @example\n * ```ts\n * const name: Result<string, string[]> = ok(\"Ada\");\n * const age: Result<number, string[]> = ok(36);\n *\n * validateTuple([name, age] as const);\n * // Result<readonly [string, number], readonly string[][]>\n *\n * validateTuple([name, age] as const, (l, r) => [...l, ...r]);\n * // Result<readonly [string, number], string[]>\n * ```\n */\nexport function validateTuple<const R extends readonly Result<unknown, unknown>[]>(\n results: R,\n): Result<{ [K in keyof R]: InferOk<R[K]> }, readonly InferErr<R[number]>[]>;\nexport function validateTuple<\n const R extends readonly Result<unknown, unknown>[],\n E = InferErr<R[number]>,\n>(\n results: R & readonly Result<unknown, E>[],\n combineErrors: (left: E, right: E) => E,\n): Result<{ [K in keyof R]: InferOk<R[K]> }, E>;\nexport function validateTuple(\n results: readonly Result<unknown, unknown>[],\n combineErrors?: (left: unknown, right: unknown) => unknown,\n): Result<readonly unknown[], unknown> {\n // Runtime identical to validateAll; the overloads restore per-index tuple types.\n return combineErrors ? validateAll(results, combineErrors) : validateAll(results);\n}\n","/** @deprecated Migration shim — prefer `@onrails/result` and `@onrails/result/fluent`. */\nimport { ResultAsync as CoreResultAsync } from \"../async.js\";\nimport { combineTuple } from \"../collections.js\";\nimport type { InferErr, InferOk } from \"../internal/infer.js\";\nimport {\n err as coreErr,\n ok as coreOk,\n flatMap,\n isErr,\n isOk,\n map,\n mapErr,\n trySync,\n unwrapOr,\n} from \"../result.js\";\nimport type { Result as ResultType } from \"../types.js\";\n\ntype TupleOk<R extends readonly CompatResult<unknown, unknown>[]> = {\n [K in keyof R]: R[K] extends CompatResult<infer T, unknown> ? T : never;\n};\ntype TupleErr<R extends readonly CompatResult<unknown, unknown>[]> = {\n [K in keyof R]: R[K] extends CompatResult<unknown, infer F> ? F : never;\n}[number];\n\ntype AsyncTupleOk<R extends readonly CompatResultAsync<unknown, unknown>[]> = {\n [K in keyof R]: R[K] extends CompatResultAsync<infer T, unknown> ? T : never;\n};\ntype AsyncTupleErr<R extends readonly CompatResultAsync<unknown, unknown>[]> = {\n [K in keyof R]: R[K] extends CompatResultAsync<unknown, infer F> ? F : never;\n}[number];\n\nexport class CompatResult<T, E> {\n constructor(readonly inner: ResultType<T, E>) {}\n\n static fromThrowable<A extends readonly unknown[], U, F>(\n fn: (...args: A) => U,\n onThrow: (error: unknown) => F,\n ): (...args: A) => CompatResult<U, F> {\n const wrapped = trySync(fn, onThrow);\n return (...args: A) => new CompatResult(wrapped(...args));\n }\n\n static combine<const R extends readonly CompatResult<unknown, unknown>[]>(\n results: R,\n ): CompatResult<TupleOk<R>, TupleErr<R>> {\n return new CompatResult(\n combineTuple(results.map((r) => r.inner)) as ResultType<TupleOk<R>, TupleErr<R>>,\n );\n }\n\n get value(): T {\n return this._unsafeUnwrap();\n }\n\n get error(): E {\n return this._unsafeUnwrapErr();\n }\n\n isOk(): boolean {\n return isOk(this.inner);\n }\n\n isErr(): boolean {\n return isErr(this.inner);\n }\n\n map<U>(fn: (value: T) => U): CompatResult<U, E> {\n return new CompatResult(map(this.inner, fn));\n }\n\n mapErr<F>(fn: (error: E) => F): CompatResult<T, F> {\n return new CompatResult(mapErr(this.inner, fn));\n }\n\n andThen<U, F = E>(fn: (value: T) => CompatResult<U, F>): CompatResult<U, E | F> {\n return new CompatResult(flatMap(this.inner, (value) => fn(value).inner));\n }\n\n asyncAndThen<U, F = E>(\n fn: (value: T) => CompatResultAsync<U, F> | CoreResultAsync<U, F>,\n ): CompatResultAsync<U, E | F> {\n return isErr(this.inner)\n ? CompatResultAsync.err(this.inner.error)\n : CompatResultAsync.fromInner(coerceToCoreAsync(fn(this.inner.value)));\n }\n\n orElse<F>(fn: (error: E) => CompatResult<T, F>): CompatResult<T, F> {\n return isOk(this.inner) ? new CompatResult<T, F>(this.inner) : fn(this.inner.error);\n }\n\n match<U1, U2 = U1>(onOk: (value: T) => U1, onErr: (error: E) => U2): U1 | U2 {\n return isOk(this.inner) ? onOk(this.inner.value) : onErr(this.inner.error);\n }\n\n unwrapOr<U>(defaultValue: U): T | U {\n return unwrapOr(this.inner as ResultType<T | U, E>, defaultValue);\n }\n\n _unsafeUnwrap(): T {\n if (isErr(this.inner)) {\n throw new Error(\"Called _unsafeUnwrap on Err\");\n }\n return this.inner.value;\n }\n\n _unsafeUnwrapErr(): E {\n if (isOk(this.inner)) {\n throw new Error(\"Called _unsafeUnwrapErr on Ok\");\n }\n return this.inner.error;\n }\n}\n\nexport const Result = CompatResult;\nexport type Result<T, E> = CompatResult<T, E>;\n\nexport const ok = <T, E = never>(value: T): CompatResult<T, E> => new CompatResult(coreOk(value));\nexport const err = <T = never, E = unknown>(error: E): CompatResult<T, E> =>\n new CompatResult(coreErr(error));\n\n/** `await` yields `CompatResult` so `.isOk()` / `.value` / `.match()` work without `.resolve()`. */\nexport class CompatResultAsync<T, E> implements PromiseLike<CompatResult<T, E>> {\n private constructor(private readonly inner: CoreResultAsync<T, E>) {}\n\n static fromInner<T, E>(inner: CoreResultAsync<T, E>): CompatResultAsync<T, E> {\n return new CompatResultAsync(inner);\n }\n\n toCore(): CoreResultAsync<T, E> {\n return this.inner;\n }\n\n static ok<T, E = never>(value: T): CompatResultAsync<T, E> {\n return new CompatResultAsync(CoreResultAsync.ok(value));\n }\n\n static err<T = never, E = unknown>(error: E): CompatResultAsync<T, E> {\n return new CompatResultAsync(CoreResultAsync.err<T, E>(error));\n }\n\n static fromPromise<T, E>(\n promise: PromiseLike<T>,\n onReject: (error: unknown) => E,\n ): CompatResultAsync<T, E> {\n return new CompatResultAsync(CoreResultAsync.fromPromise(promise, onReject));\n }\n\n static fromSafePromise<T, E = never>(promise: PromiseLike<T>): CompatResultAsync<T, E> {\n return new CompatResultAsync(CoreResultAsync.fromSafePromise<T, E>(promise));\n }\n\n static fromThrowable<A extends readonly unknown[], U, F>(\n fn: (...args: A) => Promise<U>,\n onThrow: (error: unknown) => F,\n ): (...args: A) => CompatResultAsync<U, F> {\n return (...args: A) => CompatResultAsync.fromPromise(fn(...args), onThrow);\n }\n\n static combine<const R extends readonly CompatResultAsync<unknown, unknown>[]>(\n results: R,\n ): CompatResultAsync<AsyncTupleOk<R>, AsyncTupleErr<R>> {\n return new CompatResultAsync(\n CoreResultAsync.combine(results.map((r) => r.inner)) as CoreResultAsync<\n AsyncTupleOk<R>,\n AsyncTupleErr<R>\n >,\n );\n }\n\n // biome-ignore lint/suspicious/noThenProperty: thenable shim for `await ra` -> CompatResult\n then<R1 = CompatResult<T, E>, R2 = never>(\n onfulfilled?: ((value: CompatResult<T, E>) => R1 | PromiseLike<R1>) | undefined | null,\n onrejected?: ((reason: unknown) => R2 | PromiseLike<R2>) | undefined | null,\n ): Promise<R1 | R2> {\n return this.inner.resolve().then((r) => {\n const wrapped = new CompatResult(r);\n // Safe: without onfulfilled, R1 stays at its CompatResult<T, E> default.\n return onfulfilled ? onfulfilled(wrapped) : (wrapped as unknown as R1);\n }, onrejected ?? undefined);\n }\n\n resolve(): Promise<ResultType<T, E>> {\n return this.inner.resolve();\n }\n\n map<U>(fn: (value: T) => U): CompatResultAsync<U, E> {\n return new CompatResultAsync(this.inner.map(fn));\n }\n\n mapErr<F>(fn: (error: E) => F): CompatResultAsync<T, F> {\n return new CompatResultAsync(this.inner.mapErr(fn));\n }\n\n andThen<R extends AnyAsyncOrSyncResult>(\n fn: (value: T) => R,\n ): CompatResultAsync<UnwrapOk<R>, E | UnwrapErr<R>> {\n return new CompatResultAsync(this.inner.andThen((value) => coerceToCore(fn(value))));\n }\n\n chain<R extends AnyAsyncOrSyncResult>(fn: (value: T) => R) {\n return this.andThen(fn);\n }\n\n flatMap<R extends AnyAsyncOrSyncResult>(fn: (value: T) => R) {\n return this.andThen(fn);\n }\n\n orElse<R extends AnyAsyncOrSyncResult>(\n fn: (error: E) => R,\n ): CompatResultAsync<T | UnwrapOk<R>, UnwrapErr<R>> {\n return new CompatResultAsync(\n this.inner.orElse(\n (error) =>\n coerceToCore(fn(error)) as CoreResultAsync<T, UnwrapErr<R>> | ResultType<T, UnwrapErr<R>>,\n ) as CoreResultAsync<T | UnwrapOk<R>, UnwrapErr<R>>,\n );\n }\n\n unwrapOr<U>(defaultValue: U): Promise<T | U> {\n return this.inner.unwrapOr(defaultValue);\n }\n\n isOk(): Promise<boolean> {\n return this.inner.match(\n () => true,\n () => false,\n );\n }\n\n isErr(): Promise<boolean> {\n return this.inner.match(\n () => false,\n () => true,\n );\n }\n\n match<U1, U2 = U1>(onOk: (value: T) => U1, onErr: (error: E) => U2): Promise<U1 | U2> {\n return this.inner.match(onOk, onErr);\n }\n\n andTee(fn: (value: T) => void | Promise<void>): CompatResultAsync<T, E> {\n return new CompatResultAsync(\n CoreResultAsync.defer(async () => {\n const r = await this.inner.resolve();\n if (!isErr(r)) {\n try {\n await fn(r.value);\n } catch {\n // andTee ignores tee failures (neverthrow semantics).\n }\n }\n return r;\n }),\n );\n }\n\n orTee(fn: (error: E) => void | Promise<void>): CompatResultAsync<T, E> {\n return new CompatResultAsync(\n CoreResultAsync.defer(async () => {\n const r = await this.inner.resolve();\n if (isErr(r)) {\n try {\n await fn(r.error);\n } catch {\n // orTee ignores tee failures (neverthrow semantics).\n }\n }\n return r;\n }),\n );\n }\n}\n\ntype AnyAsyncOrSyncResult =\n | CompatResultAsync<unknown, unknown>\n | CoreResultAsync<unknown, unknown>\n | CompatResult<unknown, unknown>\n | ResultType<unknown, unknown>;\n\n// Compat wrappers first (they hide the payload behind `inner`), then the\n// shared extractor handles core Result / ResultAsync.\ntype UnwrapOk<R> =\n R extends CompatResultAsync<infer U, unknown>\n ? U\n : R extends CompatResult<infer U, unknown>\n ? U\n : InferOk<R>;\n\ntype UnwrapErr<R> =\n R extends CompatResultAsync<unknown, infer F>\n ? F\n : R extends CompatResult<unknown, infer F>\n ? F\n : InferErr<R>;\n\nfunction coerceToCore<R extends AnyAsyncOrSyncResult>(\n next: R,\n): CoreResultAsync<UnwrapOk<R>, UnwrapErr<R>> | ResultType<UnwrapOk<R>, UnwrapErr<R>>;\nfunction coerceToCore(\n next: AnyAsyncOrSyncResult,\n): CoreResultAsync<unknown, unknown> | ResultType<unknown, unknown> {\n if (next instanceof CompatResultAsync) return next.toCore();\n if (next instanceof CoreResultAsync) return next;\n if (next instanceof CompatResult) return next.inner;\n return next;\n}\n\n/** Async-only coercion — keeps {@link CompatResult.asyncAndThen} cast-free. */\nconst coerceToCoreAsync = <U, F>(\n next: CompatResultAsync<U, F> | CoreResultAsync<U, F>,\n): CoreResultAsync<U, F> => (next instanceof CompatResultAsync ? next.toCore() : next);\n\nexport { CompatResultAsync as ResultAsync };\n\nexport const okAsync = CompatResultAsync.ok;\nexport const errAsync = CompatResultAsync.err;\nexport const fromPromise = CompatResultAsync.fromPromise;\nexport const fromSafePromise = CompatResultAsync.fromSafePromise;\n"]}
1
+ {"version":3,"sources":["../../src/internal/ctor.ts","../../src/internal/dual.ts","../../src/result.ts","../../src/types.ts","../../src/async.ts","../../src/collections.ts","../../src/compat/neverthrow.ts"],"names":[],"mappings":"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","file":"neverthrow.js","sourcesContent":["import type { Result } from \"../types.js\";\n\n/**\n * Unlocked `Ok` constructor for library internals.\n *\n * The public {@link ok} takes a `const` type parameter so caller literals stay\n * narrow. That is wrong inside a generic transform, where the payload type is\n * an unresolved type parameter and the resulting `Locked<T>` would never reduce\n * back to `T`. Internals build results through this constructor instead.\n */\nexport const mkOk = <T, E = never>(value: T): Result<T, E> => ({\n _tag: \"Ok\",\n value,\n});\n\n/** Unlocked `Err` constructor for library internals. Mirror of {@link mkOk}. */\nexport const mkErr = <T = never, E = unknown>(error: E): Result<T, E> => ({\n _tag: \"Err\",\n error,\n});\n","/**\n * @onrails/result internal — owning module for the **dual-form idiom**.\n *\n * Every dual-form transform in this package (`map`, `flatMap`, `match`, …)\n * accepts either shape:\n *\n * data-first: `map(result, fn)` — full arity, runs immediately\n * curried: `map(fn)(result)` — arity minus the leading `self`, returns\n * a unary function awaiting the data\n *\n * {@link dual} is the single arity dispatcher those transforms derive from;\n * hand-rolled `args.length` checks are not allowed elsewhere.\n *\n * NOTE: a twin copy of this module lives at `packages/maybe/src/internal/dual.ts`\n * — keep the two in sync when editing.\n *\n * Internal only: not listed in package.json `exports` or tsup entries.\n */\n\n/**\n * Derive a dual-form (data-first / curried) function from a single\n * data-first `body`.\n *\n * When called with `args.length >= arity` the wrapper runs `body(...args)`\n * (data-first). With fewer arguments it returns `(self) => body(self, ...args)`\n * — the curried, data-last-`self` form used with `pipe`/`flow`.\n *\n * The public type is supplied entirely by the caller: annotate the exported\n * const with the exact overload set and let `F` be inferred from it.\n *\n * @example\n * ```ts\n * export const map: {\n * <T, U, E>(result: Result<T, E>, fn: (value: T) => U): Result<U, E>;\n * <T, U>(fn: (value: T) => U): <E>(result: Result<T, E>) => Result<U, E>;\n * } = dual(\n * 2,\n * <T, U, E>(result: Result<T, E>, fn: (value: T) => U): Result<U, E> =>\n * isOk(result) ? ok(fn(result.value)) : err(result.error),\n * );\n * ```\n */\nexport const dual = <F>(arity: number, body: (...args: never[]) => unknown): F => {\n // `(...args: never[]) => unknown` is the top function type, so every typed\n // body is assignable to the parameter — but it cannot be invoked with\n // `unknown` arguments. Re-view it through the variadic shape the dispatcher\n // actually forwards; the constraint is that `body` only ever receives the\n // arguments the caller's overload annotation admitted.\n const run = body as (...args: readonly unknown[]) => unknown;\n const dispatcher = (...args: readonly unknown[]): unknown =>\n args.length >= arity ? run(...args) : (self: unknown) => run(self, ...args);\n // The caller's overload annotation on the exported const supplies the real\n // public type; internally the dispatcher stays `unknown`-typed.\n return dispatcher as F;\n};\n","import { mkErr, mkOk } from \"./internal/ctor.js\";\nimport { dual } from \"./internal/dual.js\";\nimport type { Locked } from \"./internal/lock.js\";\nimport { toError } from \"./internal/to-error.js\";\nimport type { Err, Ok, Result } from \"./types.js\";\n\nexport type { Err, Ok, Result } from \"./types.js\";\n\n/**\n * Lifts a value into the success track.\n *\n * @example\n * ```ts\n * const r = ok(42); // Result<42, never> — literal locked\n * const typed: Result<number, \"parse\"> = ok(1);\n * const lift = <T, E>(v: T): Result<T, E> => ok<T, E>(v); // explicit args opt out\n * ```\n *\n * @remarks\n * An inline literal keeps its narrow type instead of widening (`ok(\"a\")` is\n * `Result<\"a\", never>`, not `Result<string, never>`). Pass both type arguments\n * to opt out — generic code that must produce `Result<T, E>` for an unresolved\n * `T` needs that form.\n */\nexport function ok<const T>(value: T): Result<Locked<T>, never>;\nexport function ok<T, E>(value: T): Result<T, E>;\nexport function ok<T>(value: T): Result<T, never> {\n // Safe: `Locked<T>` only unwraps the readonly tuple that `const` inference\n // adds; the runtime payload is the value the caller passed, unchanged.\n return mkOk(value);\n}\n\n/**\n * Fantasy Land `pure` — alias of {@link ok}. One lift name shared across the\n * trio (`of` / `Maybe.of` / `ResultAsync.of`) for generic and FL-style code.\n *\n * @example\n * ```ts\n * const r = of(42); // Result<42, never> — identical to ok(42)\n * ```\n */\nexport const of = ok;\n\n/**\n * Lifts a value into the error track.\n *\n * @example\n * ```ts\n * const r = err({ kind: \"parse\", message: \"bad json\" });\n * // Result<never, { readonly kind: \"parse\"; readonly message: string }>\n *\n * type AppError = { kind: \"parse\" } | { kind: \"io\" };\n * err<AppError>({ kind: \"io\" }); // Result<never, AppError> — one arg names the error\n * err<number, AppError>({ kind: \"io\" }); // Result<number, AppError> — neverthrow's T, E order\n * ```\n *\n * @remarks\n * One explicit type argument names the **error** channel, which is what the\n * call site almost always means. Both channels still take neverthrow's `T, E`\n * order, and that two-argument form is also the escape hatch for generic code:\n * inference-driven calls lock literals, so a generic `E` must be passed\n * explicitly to keep the error type from being rewritten.\n */\nexport function err<const E>(error: E): Result<never, Locked<E>>;\nexport function err<T, E>(error: E): Result<T, E>;\nexport function err<E>(error: E): Result<never, E> {\n // Safe: see the note on `ok` — `Locked` is a type-level unwrap only.\n return mkErr(error);\n}\n\n/**\n * Type-narrowing predicate: returns `true` when the result is `Ok`.\n *\n * @example\n * ```ts\n * if (isOk(r)) {\n * console.log(r.value); // narrowed to Ok branch\n * }\n * ```\n */\nexport const isOk = <T, E>(result: Result<T, E>): result is Ok<T, E> => result._tag === \"Ok\";\n\n/**\n * Type-narrowing predicate: returns `true` when the result is `Err`.\n *\n * @example\n * ```ts\n * if (isErr(r)) {\n * metrics.inc(\"error\", { kind: r.error.kind });\n * }\n * ```\n */\nexport const isErr = <T, E>(result: Result<T, E>): result is Err<T, E> => result._tag === \"Err\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Dual-form helpers — each export accepts either shape:\n// data-first: `map(result, fn)`\n// curried: `map(fn)(result)`\n// Arity dispatch is derived from the internal `dual` combinator\n// (src/internal/dual.ts); the const annotation carries the public overloads.\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Transform the `Ok` value, passing `Err` through unchanged. Dual-form:\n * call data-first or curried (for use with {@link pipe}).\n *\n * @example\n * ```ts\n * map(ok(2), (n) => n * 3); // Ok 6 — data-first\n * pipe(ok(\"x\"), map((s) => s.length));// Ok 1 — curried\n * ```\n */\nexport const map: {\n <T, U, E>(result: Result<T, E>, fn: (value: T) => U): Result<U, E>;\n <T, U>(fn: (value: T) => U): <E>(result: Result<T, E>) => Result<U, E>;\n} = dual(\n 2,\n <T, U, E>(result: Result<T, E>, fn: (value: T) => U): Result<U, E> =>\n isOk(result) ? mkOk(fn(result.value)) : mkErr(result.error),\n);\n\n/**\n * Transform the `Err` value, passing `Ok` through unchanged. Useful for\n * unifying heterogeneous failure types into one app-level union.\n *\n * @example\n * ```ts\n * type AppError = { kind: \"http\"; status: number } | { kind: \"parse\" };\n * pipe(\n * fetchSync(url), // Result<Body, { status: number }>\n * mapErr((e): AppError => ({ kind: \"http\", status: e.status })),\n * );\n * ```\n */\nexport const mapErr: {\n <T, E, F>(result: Result<T, E>, fn: (error: E) => F): Result<T, F>;\n <E, F>(fn: (error: E) => F): <T>(result: Result<T, E>) => Result<T, F>;\n} = dual(\n 2,\n <T, E, F>(result: Result<T, E>, fn: (error: E) => F): Result<T, F> =>\n isErr(result) ? mkErr(fn(result.error)) : mkOk(result.value),\n);\n\n/**\n * Transform both tracks at once — `Ok` via `onOk`, `Err` via `onErr`.\n * Equivalent to `mapErr(onErr)(map(onOk)(result))` but in one pass.\n *\n * @example\n * ```ts\n * bimap(parsed, (cfg) => cfg.name, (e) => ({ kind: \"input\", cause: e }));\n * ```\n */\nexport const bimap: {\n <T, U, E, F>(result: Result<T, E>, onOk: (value: T) => U, onErr: (error: E) => F): Result<U, F>;\n <T, U, E, F>(\n onOk: (value: T) => U,\n onErr: (error: E) => F,\n ): (result: Result<T, E>) => Result<U, F>;\n} = dual(\n 3,\n <T, U, E, F>(\n result: Result<T, E>,\n onOk: (value: T) => U,\n onErr: (error: E) => F,\n ): Result<U, F> => (isOk(result) ? mkOk(onOk(result.value)) : mkErr(onErr(result.error))),\n);\n\n/**\n * Canonical bind (Fantasy Land `chain`). Chains a Result-returning step,\n * widening the error union to `E | F`. Short-circuits on `Err`.\n *\n * @example\n * ```ts\n * flatMap(parseInput(raw), (data) =>\n * data.id != null ? ok(data) : err({ kind: \"missing_id\" as const }),\n * );\n * // Result<Data, ParseError | { kind: \"missing_id\" }>\n * ```\n */\nexport const flatMap: {\n <T, U, E, F>(result: Result<T, E>, fn: (value: T) => Result<U, F>): Result<U, E | F>;\n <T, U, F>(fn: (value: T) => Result<U, F>): <E>(result: Result<T, E>) => Result<U, E | F>;\n} = dual(\n 2,\n <T, U, E, F>(result: Result<T, E>, fn: (value: T) => Result<U, F>): Result<U, E | F> =>\n isOk(result) ? fn(result.value) : mkErr(result.error),\n);\n\n/**\n * Error-track bind — runs `fn` only when the result is `Err`, allowing\n * a failed workflow to recover to `Ok` or remap the failure. Mirror of\n * {@link flatMap} on the error channel.\n *\n * @example\n * ```ts\n * recover(networkResult, (e) =>\n * e.kind === \"rate_limit\" ? ok(cachedBody) : err(e),\n * );\n * ```\n */\nexport const recover: {\n <T, E, F>(result: Result<T, E>, fn: (error: E) => Result<T, F>): Result<T, F>;\n <T, E, F>(fn: (error: E) => Result<T, F>): (result: Result<T, E>) => Result<T, F>;\n} = dual(\n 2,\n <T, E, F>(result: Result<T, E>, fn: (error: E) => Result<T, F>): Result<T, F> =>\n isErr(result) ? fn(result.error) : mkOk(result.value),\n);\n\n/**\n * Observe the `Ok` value for side effects (logging, metrics) without\n * changing the carried value. Passes `Err` through untouched.\n *\n * @example\n * ```ts\n * pipe(\n * parseConfig(raw),\n * tap((cfg) => log.info({ msg: \"parsed\", name: cfg.name })),\n * flatMap(validate),\n * );\n * ```\n */\nexport const tap: {\n <T, E>(result: Result<T, E>, fn: (value: T) => void): Result<T, E>;\n <T>(fn: (value: T) => void): <E>(result: Result<T, E>) => Result<T, E>;\n} = dual(2, <T, E>(result: Result<T, E>, fn: (value: T) => void): Result<T, E> => {\n if (isOk(result)) fn(result.value);\n return result;\n});\n\n/**\n * Observe the `Err` value for side effects (logging, metrics) without\n * changing the carried error. Passes `Ok` through untouched.\n *\n * @example\n * ```ts\n * pipe(\n * loadUser(id),\n * tapErr((e) => metrics.inc(\"user.load.fail\", { kind: e.kind })),\n * );\n * ```\n */\nexport const tapErr: {\n <T, E>(result: Result<T, E>, fn: (error: E) => void): Result<T, E>;\n <E>(fn: (error: E) => void): <T>(result: Result<T, E>) => Result<T, E>;\n} = dual(2, <T, E>(result: Result<T, E>, fn: (error: E) => void): Result<T, E> => {\n if (isErr(result)) fn(result.error);\n return result;\n});\n\n/**\n * Terminal collapse — fold both tracks into a single value. Dual-form:\n * 3-args data-first, 2-args curried for {@link pipe}. Returns whatever\n * the handlers return.\n *\n * For files that also import `match` from `ts-pattern`, use a namespace\n * import (`import * as R from \"@onrails/result\"` → `R.match`) to dissolve\n * the collision.\n *\n * @example\n * ```ts\n * const html = match(parsed, (cfg) => render(cfg), (e) => renderError(e));\n * ```\n */\nexport const match: {\n <T, E, U>(result: Result<T, E>, onOk: (value: T) => U, onErr: (error: E) => U): U;\n <T, E, U>(onOk: (value: T) => U, onErr: (error: E) => U): (result: Result<T, E>) => U;\n} = dual(\n 3,\n <T, E, U>(result: Result<T, E>, onOk: (value: T) => U, onErr: (error: E) => U): U =>\n isOk(result) ? onOk(result.value) : onErr(result.error),\n);\n\n/**\n * Returns the `Ok` value, or `defaultValue` when the result is `Err`. The\n * fallback may be a different type from `T` — the return widens to `T | U`,\n * matching `ResultAsync.unwrapOr` and the compat shim.\n *\n * @example\n * ```ts\n * unwrapOr(parsedSetting, \"default-value\"); // string\n * unwrapOr(parsedPort, null); // number | null\n * ```\n */\nexport const unwrapOr: {\n <T, E, U>(result: Result<T, E>, defaultValue: U): T | U;\n <U>(defaultValue: U): <T, E>(result: Result<T, E>) => T | U;\n} = dual(2, <T, E, U>(result: Result<T, E>, defaultValue: U): T | U =>\n isOk(result) ? result.value : defaultValue,\n);\n\n/**\n * Test/assert helper — returns the `Ok` value, or **throws the original `Err`\n * value** when called on an `Err`. This is the assertion tier (RFC 0001 §4):\n * intended for `*.spec.ts` / `*.test.ts`, where throwing fails the test loudly.\n * In business logic prefer {@link match} or {@link unwrapOr}; the lint plugins\n * flag `unwrapOk` outside test files.\n *\n * @returns the unwrapped `Ok` value\n * @throws the carried `Err` value when the result is `Err`\n *\n * @example\n * ```ts\n * // in a *.spec.ts\n * expect(unwrapOk(ok(5))).toBe(5);\n * expect(() => unwrapOk(err(error))).toThrow(error);\n * ```\n */\nexport function unwrapOk<T, E>(result: Result<T, E>): T {\n if (isErr(result)) throw result.error;\n return result.value;\n}\n\n/** Alias of {@link unwrapOk} for syntax cohesion with `@onrails/maybe`. */\nexport const unwrap = unwrapOk;\n\n/**\n * Test/assert helper — returns the `Err` value, or **throws a `TypeError`**\n * when called on an `Ok`. Mirror of {@link unwrapOk} on the error track and\n * part of the same assertion tier (RFC 0001 §4): intended for `*.spec.ts` /\n * `*.test.ts`. Prefer {@link match} / {@link unwrapOr} in business logic; the\n * lint plugins flag `unwrapErr` outside test files.\n *\n * @returns the unwrapped `Err` value\n * @throws `TypeError` when the result is `Ok`\n *\n * @example\n * ```ts\n * // in a *.spec.ts\n * expect(unwrapErr(err(\"x\"))).toBe(\"x\");\n * expect(() => unwrapErr(ok(5))).toThrow(TypeError);\n * ```\n */\nexport function unwrapErr<T, E>(result: Result<T, E>): E {\n if (isOk(result)) throw new TypeError(\"unwrapErr called on Ok\");\n return result.error;\n}\n\n/**\n * Wraps a throwing sync **function**, returning a function that produces a\n * {@link Result} instead of throwing. Thrown errors pass through `onThrow` to\n * become a typed `Err`; a normal return becomes `Ok`. Same name and shape as\n * neverthrow's `Result.fromThrowable`.\n *\n * Reach for {@link trySync} instead when you want to run the call right now\n * rather than build a reusable wrapper.\n *\n * @param fn - the throwing function to wrap\n * @param onThrow - maps a thrown value to the `Err` channel\n * @returns a function with `fn`'s parameters that returns `Result<ReturnType, E>`\n *\n * @example\n * ```ts\n * type ParseError = { kind: \"parse\"; message: string };\n * const parse = fromThrowable(\n * JSON.parse,\n * (e): ParseError => ({ kind: \"parse\", message: String(e) }),\n * );\n * parse(\"{}\"); // Ok({})\n * parse(\"nope\"); // Err({ kind: \"parse\", … })\n * ```\n */\nexport function fromThrowable<A extends readonly unknown[], T, E>(\n fn: (...args: A) => T,\n onThrow: (error: unknown) => E,\n): (...args: A) => Result<T, E>;\nexport function fromThrowable<F extends (...args: never) => unknown, E>(\n fn: F,\n onThrow: (error: unknown) => E,\n): (...args: Parameters<F>) => Result<ReturnType<F>, E>;\nexport function fromThrowable(\n fn: (...args: never) => unknown,\n onThrow: (error: unknown) => unknown,\n): (...args: never) => Result<unknown, unknown> {\n return (...args: never) => {\n try {\n return mkOk(fn(...args));\n } catch (error) {\n return mkErr(onThrow(error));\n }\n };\n}\n\n/**\n * Runs `fn` **now**, catching a throw into the `Err` track — the sync mirror\n * of `tryAsync`. Without `onThrow` the thrown value is normalized to an\n * `Error`; pass a mapper for a typed error.\n *\n * To lift a throwing function once and call it many times, use\n * {@link fromThrowable}.\n *\n * @param fn - the throwing thunk to run\n * @param onThrow - maps a thrown value to the `Err` channel\n *\n * @example\n * ```ts\n * trySync(() => JSON.parse(raw)); // Result<unknown, Error>\n * trySync(() => Schema.parse(input), (e): SchemaError => ({\n * kind: \"schema\",\n * cause: e,\n * }));\n * ```\n */\nexport function trySync<T>(fn: () => T): Result<T, Error>;\nexport function trySync<T, E>(fn: () => T, onThrow: (error: unknown) => E): Result<T, E>;\nexport function trySync<T, E>(fn: () => T, onThrow?: (error: unknown) => E): Result<T, E | Error> {\n try {\n return mkOk(fn());\n } catch (error) {\n return mkErr(onThrow ? onThrow(error) : toError(error));\n }\n}\n\nconst printPayload = (payload: unknown): string => {\n try {\n return JSON.stringify(payload) ?? String(payload);\n } catch {\n // cyclic or non-JSON payload — a debug printer must not throw\n return String(payload);\n }\n};\n\n/**\n * Debug printer — renders a result as `Ok(…)` / `Err(…)` for logs. Payloads\n * print as JSON (values are plain data by design); non-JSON payloads fall\n * back to `String(...)`.\n *\n * @example\n * ```ts\n * show(ok(1)); // 'Ok(1)'\n * show(err({ kind: \"e\" })); // 'Err({\"kind\":\"e\"})'\n * ```\n */\nexport const show = <T, E>(result: Result<T, E>): string =>\n isOk(result) ? `Ok(${printPayload(result.value)})` : `Err(${printPayload(result.error)})`;\n","/**\n * The core railway type: a tagged union carrying either a success value\n * (`Ok<T>`) or a failure value (`Err<E>`). It is a plain discriminated union\n * on `_tag` — no classes — so it is immutable and tree-shake friendly. Narrow\n * with {@link isOk} / {@link isErr} to read `.value` / `.error`.\n *\n * @typeParam T - the `Ok` value type\n * @typeParam E - the `Err` error type\n *\n * @example\n * ```ts\n * function parse(raw: string): Result<number, \"nan\"> {\n * const n = Number(raw);\n * return Number.isNaN(n) ? err(\"nan\") : ok(n);\n * }\n * ```\n */\nexport type Result<T, E> =\n | { readonly _tag: \"Ok\"; readonly value: T }\n | { readonly _tag: \"Err\"; readonly error: E };\n\n/**\n * The success branch of a {@link Result} — `{ _tag: \"Ok\"; value: T }`.\n * The `E` parameter keeps the type assignable to `Result<T, E>`.\n */\nexport type Ok<T, E = never> = Extract<Result<T, E>, { _tag: \"Ok\" }>;\n\n/**\n * The failure branch of a {@link Result} — `{ _tag: \"Err\"; error: E }`.\n */\nexport type Err<T, E> = Extract<Result<T, E>, { _tag: \"Err\" }>;\n\n/**\n * Error subclass representing an **unexpected** defect — a thrown exception or\n * promise rejection that was not part of the modelled `Err` union. Used as the\n * default mapping when {@link fromAsync} is called without an `onDefect`\n * handler; the original cause is preserved on `.cause`.\n *\n * @example\n * ```ts\n * const defect = new UnexpectedError(\"Unexpected async defect\", caught);\n * defect.cause; // the original thrown value\n * ```\n */\nexport class UnexpectedError extends Error {\n constructor(\n message: string,\n override readonly cause?: unknown,\n ) {\n super(message);\n this.name = \"UnexpectedError\";\n }\n}\n","import { mkErr, mkOk } from \"./internal/ctor.js\";\nimport type { InferErr, InferOk } from \"./internal/infer.js\";\nimport type { Locked } from \"./internal/lock.js\";\nimport { bimap, isErr, map, mapErr } from \"./result.js\";\nimport type { Result } from \"./types.js\";\nimport { UnexpectedError } from \"./types.js\";\n\ntype PromiseFactory<T, E> = () => Promise<Result<T, E>>;\ntype AnyResultAsync = ResultAsync<unknown, unknown>;\n\n/**\n * Mirrors the sync `CombineTuple` in `./collections.ts`: the element check\n * lives in the RETURN type, never in the parameter constraint. A\n * `ResultAsync<unknown, unknown>` constraint contextually types the arguments\n * and widens `okAsync(1)`'s defaulted `E = never` to `unknown`, so call sites\n * would need hoisted intermediates to keep their error union.\n */\ntype CombineTupleAsync<R extends readonly unknown[]> = R[number] extends AnyResultAsync\n ? ResultAsync<{ [K in keyof R]: InferOk<R[K]> }, InferErr<R[number]>>\n : never;\n\n/** Mirrors `TupleGuard` in `./collections.ts` — see the note there. */\ntype AsyncTupleGuard<R extends readonly unknown[]> = R[number] extends AnyResultAsync\n ? []\n : [error: \"expected an array of ResultAsync values\"];\n\n/** Collapses settled results left-to-right, short-circuiting on the first `Err`. */\nconst sequenceSettled = (\n settled: readonly Result<unknown, unknown>[],\n): Result<unknown[], unknown> => {\n const values: unknown[] = [];\n for (const result of settled) {\n if (isErr(result)) {\n return mkErr(result.error);\n }\n values.push(result.value);\n }\n return mkOk(values);\n};\n\n/**\n * Async railway carrier. Wraps a deferred `Promise<Result<T, E>>` and exposes\n * the same dual-track transforms as the sync {@link Result} — `map`, `mapErr`,\n * `bimap`, `flatMap`, `recover`, `tap`, `match`. The public API never surfaces `Promise<Result<…>>`\n * directly: `await` the instance (it is thenable) or call {@link resolve} /\n * {@link match} to settle it.\n *\n * Construct via the static factories ({@link ok}, {@link err}, {@link fromPromise},\n * {@link defer}, …) rather than `new` — the constructor is `protected`.\n *\n * @typeParam T - the `Ok` value type\n * @typeParam E - the `Err` error type\n *\n * @example\n * ```ts\n * const user = ResultAsync.fromPromise(api.getUser(id), toAppError)\n * .map((u) => u.profile)\n * .recover(() => ResultAsync.ok(guestProfile));\n *\n * const r = await user; // Result<Profile, AppError>\n * ```\n */\nexport class ResultAsync<T, E> {\n private promise: Promise<Result<T, E>> | null = null;\n\n protected constructor(protected readonly run: PromiseFactory<T, E>) {}\n\n /**\n * Lifts an already-settled sync {@link Result} into a {@link ResultAsync}.\n *\n * @example\n * ```ts\n * const ra = ResultAsync.fromResult(ok(42)); // ResultAsync<number, never>\n * ```\n */\n static fromResult<T, E>(result: Result<T, E>): ResultAsync<T, E> {\n return new ResultAsync(async () => result);\n }\n\n /**\n * Wraps a `PromiseLike<T>` that may reject. Rejections pass through `onReject`\n * to become a typed `Err`; resolution becomes `Ok<T>`.\n *\n * @param promise - the promise to wrap\n * @param onReject - maps a rejection reason to the `Err` channel\n *\n * @example\n * ```ts\n * const body = ResultAsync.fromPromise(\n * fetch(url).then((r) => r.text()),\n * (e): NetError => ({ kind: \"net\", cause: String(e) }),\n * );\n * ```\n */\n static fromPromise<T, E>(\n promise: PromiseLike<T>,\n onReject: (error: unknown) => E,\n ): ResultAsync<T, E> {\n return new ResultAsync(async () => {\n try {\n return mkOk(await promise);\n } catch (error) {\n return mkErr(onReject(error));\n }\n });\n }\n\n /**\n * Wraps a `PromiseLike<T>` that is **guaranteed not to reject**, skipping the\n * `onReject` mapper. Use only when rejection is provably impossible.\n *\n * @example\n * ```ts\n * const now = ResultAsync.fromSafePromise(Promise.resolve(Date.now()));\n * ```\n */\n static fromSafePromise<T, E = never>(promise: PromiseLike<T>): ResultAsync<T, E> {\n return new ResultAsync(async () => mkOk(await promise));\n }\n\n /**\n * Defers work until {@link resolve}. Unlike {@link fromPromise}, the factory\n * does not run until the `ResultAsync` is resolved (e.g. by `combineTuple` /\n * `combineTupleParallel`). The factory runs at most once — `resolve` memoizes.\n *\n * @example\n * ```ts\n * const insert = ResultAsync.defer(() => db.orders.insert(row));\n * // nothing has run yet\n * const r = await insert; // factory runs exactly once here\n * ```\n */\n static defer<T, E>(fn: () => Promise<Result<T, E>>): ResultAsync<T, E> {\n return new ResultAsync(fn);\n }\n\n /**\n * Lifts a value into an `Ok` async result.\n *\n * @example\n * ```ts\n * const r = ResultAsync.ok(42); // ResultAsync<number, never>\n * ```\n */\n static ok<const T>(value: T): ResultAsync<Locked<T>, never>;\n static ok<T, E>(value: T): ResultAsync<T, E>;\n static ok<T, E = never>(value: T): ResultAsync<T, E> {\n return new ResultAsync(async () => mkOk(value));\n }\n\n /**\n * Fantasy Land `pure` — alias of {@link ResultAsync.ok}. One lift name\n * shared across the trio (`of` / `Maybe.of` / `ResultAsync.of`).\n */\n static of<const T>(value: T): ResultAsync<Locked<T>, never>;\n static of<T, E>(value: T): ResultAsync<T, E>;\n static of<T, E = never>(value: T): ResultAsync<T, E> {\n return ResultAsync.ok<T, E>(value);\n }\n\n /**\n * Lifts an error into an `Err` async result.\n *\n * @example\n * ```ts\n * const r = ResultAsync.err({ kind: \"not_found\" as const });\n * ```\n */\n static err<const E>(error: E): ResultAsync<never, Locked<E>>;\n static err<T, E>(error: E): ResultAsync<T, E>;\n static err<T = never, E = unknown>(error: E): ResultAsync<T, E> {\n return new ResultAsync(async () => mkErr(error));\n }\n\n /**\n * Lifts an existing `Promise<Result<T, E>>` (e.g. from interop code) into a\n * {@link ResultAsync}. A thrown defect is routed through `onDefect`,\n * defaulting to {@link UnexpectedError}. The `Ok` value passes through\n * verbatim — even when it happens to be Result-shaped.\n *\n * @param promise - a promise that already yields a `Result`\n * @param onDefect - maps an unexpected throw to the `Err` channel\n * @see {@link fromAsync} from `@onrails/result`\n */\n static fromResultPromise<T, E>(\n promise: Promise<Result<T, E>>,\n onDefect?: (error: unknown) => E | UnexpectedError,\n ): ResultAsync<T, E | UnexpectedError> {\n const mapDefect =\n onDefect ?? ((error: unknown) => new UnexpectedError(\"Unexpected async defect\", error));\n return new ResultAsync<T, E | UnexpectedError>(async () => {\n try {\n return await promise;\n } catch (error) {\n return mkErr(mapDefect(error));\n }\n });\n }\n\n /**\n * Combines a homogeneous array of async results into one. Resolves\n * **sequentially** in input order, short-circuiting on the first `Err`.\n * For heterogeneous tuples that preserve per-index types, use\n * {@link combineTuple}; for wall-clock overlap, {@link combineTupleParallel}.\n *\n * @example\n * ```ts\n * const all = ResultAsync.combine([loadA(), loadB(), loadC()]);\n * // ResultAsync<Item[], LoadError>\n * ```\n */\n static combine<T, E>(results: readonly ResultAsync<T, E>[]): ResultAsync<T[], E> {\n return new ResultAsync(async () => {\n const values: T[] = [];\n for (const ra of results) {\n const result = await ra.resolve();\n if (isErr(result)) {\n return mkErr(result.error);\n }\n values.push(result.value);\n }\n return mkOk(values);\n });\n }\n\n /**\n * Heterogeneous async tuple combine — resolves branches **sequentially**\n * (left-to-right), returning the first `Err` in input order. Preserves each\n * branch's `Ok` type by position, so the result destructures type-safely.\n * This is the canonical sequential async combine (replaces the former\n * `sequenceTupleAsync`).\n *\n * @example\n * ```ts\n * const combined = ResultAsync.combineTuple([loadCfg(), loadCatalog()]);\n * // ResultAsync<readonly [Cfg, Catalog], CfgError | CatalogError>\n * const r = await combined;\n * if (isOk(r)) {\n * const [cfg, catalog] = r.value; // typed per position\n * }\n * ```\n */\n static combineTuple<const R extends readonly unknown[]>(\n results: R,\n ..._guard: AsyncTupleGuard<R>\n ): CombineTupleAsync<R> {\n // Runtime identical to combine; the cast restores per-index tuple types.\n return ResultAsync.combine(\n results as readonly AnyResultAsync[],\n ) as unknown as CombineTupleAsync<R>;\n }\n\n /**\n * Like {@link combineTuple}, but starts every branch before awaiting (wall-clock\n * parallel for independent IO). On failure, returns the first `Err` in input order.\n *\n * @example\n * ```ts\n * // independent IO — overlap them\n * const combined = ResultAsync.combineTupleParallel([\n * loadProfile(id),\n * loadMetrics(id),\n * ]);\n * ```\n */\n static combineTupleParallel<const R extends readonly unknown[]>(\n results: R,\n ..._guard: AsyncTupleGuard<R>\n ): CombineTupleAsync<R> {\n // Cast restores per-index tuple types over the untyped sequence core.\n return new ResultAsync(async () =>\n sequenceSettled(\n await Promise.all((results as readonly AnyResultAsync[]).map((ra) => ra.resolve())),\n ),\n ) as unknown as CombineTupleAsync<R>;\n }\n\n /**\n * Transforms the `Ok` value, passing `Err` through unchanged.\n *\n * @example\n * ```ts\n * ResultAsync.ok(2).map((n) => n * 3); // ResultAsync<number> → Ok 6\n * ```\n */\n map<U>(fn: (value: T) => U): ResultAsync<U, E> {\n return new ResultAsync(async () => map(await this.resolve(), fn));\n }\n\n /**\n * Transforms the `Err` value, passing `Ok` through unchanged — useful for\n * unifying heterogeneous failures into one app-level union.\n *\n * @example\n * ```ts\n * load(id).mapErr((e): AppError => ({ kind: \"load\", cause: e })); // ResultAsync<T, AppError>\n * ```\n */\n mapErr<F>(fn: (error: E) => F): ResultAsync<T, F> {\n return new ResultAsync(async () => mapErr(await this.resolve(), fn));\n }\n\n /**\n * Transforms both tracks in one step — the async mirror of the sync\n * `bimap`. Exactly one of `onOk` / `onErr` runs.\n *\n * @example\n * ```ts\n * load(id).bimap(toDto, (e): AppError => ({ kind: \"load\", cause: e }));\n * ```\n */\n bimap<U, F>(onOk: (value: T) => U, onErr: (error: E) => F): ResultAsync<U, F> {\n return new ResultAsync(async () => bimap(await this.resolve(), onOk, onErr));\n }\n\n /**\n * Canonical bind — chains a step that itself returns a `ResultAsync` or sync\n * `Result`, short-circuiting on `Err`. Error types accumulate (`E | F`).\n *\n * @example\n * ```ts\n * authenticate(req)\n * .flatMap((user) => loadProfile(user.id)) // ResultAsync\n * .flatMap((p) => validate(p)); // sync Result also accepted\n * ```\n */\n flatMap<U, F = E>(fn: (value: T) => ResultAsync<U, F> | Result<U, F>): ResultAsync<U, E | F> {\n return new ResultAsync<U, E | F>(async () => {\n const first = await this.resolve();\n if (isErr(first)) {\n return first;\n }\n const next = fn(first.value);\n return next instanceof ResultAsync ? next.resolve() : next;\n });\n }\n\n /**\n * neverthrow-compat alias of {@link flatMap}. Kept as the documented compat\n * tier; prefer {@link flatMap} in new code.\n *\n * @example\n * ```ts\n * authenticate(req).andThen((user) => loadProfile(user.id));\n * ```\n */\n andThen<U, F = E>(fn: (value: T) => ResultAsync<U, F> | Result<U, F>): ResultAsync<U, E | F> {\n return this.flatMap(fn);\n }\n\n /**\n * Error-channel bind — runs `fn` only on `Err`, swapping in a recovery\n * `ResultAsync` or sync `Result`. `Ok` passes through. The mirror of\n * {@link flatMap} on the error track.\n *\n * @example\n * ```ts\n * loadFromCache(id).recover(() => loadFromOrigin(id)); // ResultAsync<T, F>\n * ```\n */\n recover<F>(fn: (error: E) => ResultAsync<T, F> | Result<T, F>): ResultAsync<T, F> {\n return new ResultAsync<T, F>(async () => {\n const first = await this.resolve();\n if (!isErr(first)) {\n return first;\n }\n const next = fn(first.error);\n return next instanceof ResultAsync ? next.resolve() : next;\n });\n }\n\n /**\n * neverthrow-compat alias of {@link recover}. Kept as the documented compat\n * tier; prefer {@link recover} in new code.\n *\n * @example\n * ```ts\n * loadFromCache(id).orElse(() => loadFromOrigin(id));\n * ```\n */\n orElse<F>(fn: (error: E) => ResultAsync<T, F> | Result<T, F>): ResultAsync<T, F> {\n return this.recover(fn);\n }\n\n /**\n * Runs a side effect on the `Ok` value and passes the result through\n * unchanged; a no-op on `Err`. Mirrors {@link tapErr}.\n *\n * @example\n * ```ts\n * saveUser(u).tap((saved) => analytics.track(\"user_saved\", saved.id));\n * ```\n */\n tap(fn: (value: T) => void): ResultAsync<T, E> {\n return new ResultAsync(async () => {\n const result = await this.resolve();\n if (!isErr(result)) {\n fn(result.value);\n }\n return result;\n });\n }\n\n /**\n * Runs a side effect on the `Err` value and passes the result through\n * unchanged; a no-op on `Ok`. The error-track mirror of {@link tap}.\n *\n * @example\n * ```ts\n * saveUser(u).tapErr((e) => logger.warn(\"save failed\", e));\n * ```\n */\n tapErr(fn: (error: E) => void): ResultAsync<T, E> {\n return new ResultAsync(async () => {\n const result = await this.resolve();\n if (isErr(result)) {\n fn(result.error);\n }\n return result;\n });\n }\n\n /**\n * Settles to the `Ok` value, or `defaultValue` if `Err`. Terminal — returns a\n * plain `Promise`, not a `ResultAsync`.\n *\n * @example\n * ```ts\n * const profile = await loadProfile(id).unwrapOr(guestProfile);\n * ```\n */\n unwrapOr<U>(defaultValue: U): Promise<T | U> {\n return this.resolve().then((result) => (isErr(result) ? defaultValue : result.value));\n }\n\n /**\n * Terminal collapse — folds both tracks into a single awaited value. Returns\n * a plain `Promise`, settling the carrier exactly once.\n *\n * @param onOk - handles the `Ok` value\n * @param onErr - handles the `Err` value\n *\n * @example\n * ```ts\n * const status = await save(row).match(\n * () => 200,\n * (e) => (e.kind === \"conflict\" ? 409 : 500),\n * );\n * ```\n */\n match<U1, U2 = U1>(onOk: (value: T) => U1, onErr: (error: E) => U2): Promise<U1 | U2> {\n return this.resolve().then((result) =>\n isErr(result) ? onErr(result.error) : onOk(result.value),\n );\n }\n\n /**\n * Settles the carrier to a bare sync {@link Result}, memoizing so the\n * underlying factory runs at most once. Prefer `await ra` (the thenable) or\n * {@link match} in app code; use `resolve` when you need the tagged union back.\n *\n * @example\n * ```ts\n * const r = await load(id).resolve(); // Result<Data, LoadError>\n * if (isOk(r)) use(r.value);\n * ```\n */\n resolve(): Promise<Result<T, E>> {\n if (!this.promise) {\n this.promise = this.run();\n }\n return this.promise;\n }\n\n /**\n * Thenable shim — `await ra` resolves to a bare tagged-union `Result<T, E>`.\n * Narrow with `isOk(r)` / `isErr(r)` to read `.value` / `.error`.\n */\n // biome-ignore lint/suspicious/noThenProperty: makes ResultAsync awaitable\n then<R1 = Result<T, E>, R2 = never>(\n onfulfilled?: ((value: Result<T, E>) => R1 | PromiseLike<R1>) | undefined | null,\n onrejected?: ((reason: unknown) => R2 | PromiseLike<R2>) | undefined | null,\n ): Promise<R1 | R2> {\n return this.resolve().then(\n // Safe: without onfulfilled, R1 stays at its Result<T, E> default.\n (r) => (onfulfilled ? onfulfilled(r) : (r as unknown as R1)),\n onrejected ?? undefined,\n );\n }\n}\n\n/**\n * The free-function lift helpers (`okAsync`, `errAsync`, `fromPromise`,\n * `fromSafePromise`, `fromResult`, `fromAsync`, `asyncAfter`, `tryAsync`)\n * live in `./async-lift.ts` and are re-exported from the package index.\n */\n","/**\n * @onrails/result — sync aggregation, one module, two axes:\n *\n * short-circuit (first `Err` wins) — {@link combine} / {@link combineTuple}\n * accumulate expected failures — {@link validateAll} / {@link validateTuple}\n *\n * The accumulate pair collects every failure into a readonly array by\n * default, or folds them with an explicit `combineErrors` when given one.\n */\n\nimport { mkErr, mkOk } from \"./internal/ctor.js\";\nimport type { InferErr, InferOk } from \"./internal/infer.js\";\nimport { isErr } from \"./result.js\";\nimport type { Result } from \"./types.js\";\n\n/**\n * Combines a homogeneous array of results into a single result holding an\n * array of the `Ok` values, in input order. Short-circuits on the first `Err`\n * (first failure wins). For heterogeneous tuples that preserve per-index\n * types, use {@link combineTuple}.\n *\n * @example\n * ```ts\n * combine([ok(1), ok(2)]); // Ok([1, 2])\n * combine([ok(1), err(\"e\")]); // Err(\"e\")\n * ```\n */\nexport const combine = <T, E>(results: readonly Result<T, E>[]): Result<T[], E> => {\n const values: T[] = [];\n for (const result of results) {\n if (isErr(result)) return mkErr(result.error);\n values.push(result.value);\n }\n return mkOk(values);\n};\n\ntype AnyResult = Result<unknown, unknown>;\n\n/** Positionally preserved `Ok` payloads for a tuple of results. */\ntype OkTuple<R extends readonly unknown[]> = { [K in keyof R]: InferOk<R[K]> };\n\n/**\n * The element check lives in the RETURN type, never in the parameter\n * constraint. A `readonly Result<unknown, unknown>[]` constraint contextually\n * types the arguments, which widens `ok(1)`'s defaulted `E = never` — and\n * `err(e)`'s `T = never` — all the way to `unknown`. Holding the parameter at\n * a bare `R` keeps both channels precise for inline literals, so call sites\n * need neither `as const` nor hoisted intermediates.\n */\ntype CombineTuple<R extends readonly unknown[]> = R[number] extends AnyResult\n ? Result<OkTuple<R>, InferErr<R[number]>>\n : never;\n\n/**\n * Restores the \"every element is a Result\" check the parameter constraint used\n * to provide. Resolves to `[]` for a well-formed tuple and to a one-element\n * tuple otherwise, so a bad call fails at the call site (with the message\n * visible in signature help) instead of silently yielding `never`.\n */\ntype TupleGuard<R extends readonly unknown[]> = R[number] extends AnyResult\n ? []\n : [error: \"expected an array of Result values\"];\n\n/**\n * Heterogeneous tuple combine — like {@link combine} but preserves each\n * branch's `Ok` type by position, so the result destructures type-safely.\n * Short-circuits on the first `Err` in input order (neverthrow-style).\n *\n * @example\n * ```ts\n * const r = combineTuple([ok(1), ok(\"x\")]);\n * // Result<readonly [number, string], never> — no `as const` needed\n * if (isOk(r)) {\n * const [n, s] = r.value; // typed per position\n * }\n * ```\n */\nexport const combineTuple = <const R extends readonly unknown[]>(\n results: R,\n ..._guard: TupleGuard<R>\n): CombineTuple<R> =>\n // Runtime identical to combine; the cast restores per-index tuple types.\n combine(results as readonly AnyResult[]) as CombineTuple<R>;\n\n/**\n * Accumulate independent validation failures. Returns `Ok<T[]>` only when\n * every input is `Ok`. Without a combiner, failures are collected into a\n * readonly array; with `combineErrors` they are folded into a single `E`.\n *\n * Unlike {@link combine}, this does **not** short-circuit on first failure —\n * use for independent checks where you want to report all problems at once.\n *\n * @example\n * ```ts\n * const checks: Result<string, string[]>[] = [ok(\"Ada\"), err([\"age required\"])];\n *\n * validateAll(checks);\n * // Result<string[], readonly string[][]>\n *\n * validateAll(checks, (left, right) => [...left, ...right]);\n * // Result<string[], string[]>\n * ```\n */\nexport function validateAll<T, E>(results: readonly Result<T, E>[]): Result<T[], readonly E[]>;\nexport function validateAll<T, E>(\n results: readonly Result<T, E>[],\n combineErrors: (left: E, right: E) => E,\n): Result<T[], E>;\nexport function validateAll<T, E>(\n results: readonly Result<T, E>[],\n combineErrors?: (left: E, right: E) => E,\n): Result<T[], E | readonly E[]> {\n const values: T[] = [];\n const errors: E[] = [];\n\n for (const result of results) {\n if (isErr(result)) {\n errors.push(result.error);\n } else {\n values.push(result.value);\n }\n }\n\n if (errors.length === 0) return mkOk(values);\n return mkErr(combineErrors ? errors.reduce(combineErrors) : errors);\n}\n\n/**\n * Tuple-preserving variant of {@link validateAll}. Heterogeneous input tuple\n * → preserved `Ok` tuple shape. Without a combiner, the error union is\n * collected into a readonly array; with `combineErrors`, all inputs must\n * share the error type `E` and failures fold into a single `E`.\n *\n * Like {@link combineTuple}, the element check lives in the return type, so\n * inline literals keep their precise error types without `as const`.\n *\n * @example\n * ```ts\n * const name: Result<string, string[]> = ok(\"Ada\");\n * const age: Result<number, string[]> = ok(36);\n *\n * validateTuple([name, age]);\n * // Result<readonly [string, number], readonly string[][]>\n *\n * validateTuple([name, age], (l, r) => [...l, ...r]);\n * // Result<readonly [string, number], string[]>\n * ```\n */\nexport function validateTuple<const R extends readonly unknown[]>(\n results: R,\n ..._guard: TupleGuard<R>\n): R[number] extends AnyResult ? Result<OkTuple<R>, readonly InferErr<R[number]>[]> : never;\nexport function validateTuple<const R extends readonly unknown[], E = InferErr<R[number]>>(\n results: R,\n combineErrors: (left: E, right: E) => E,\n ..._guard: TupleGuard<R>\n): R[number] extends AnyResult ? Result<OkTuple<R>, E> : never;\nexport function validateTuple(\n results: readonly AnyResult[],\n // Rest-typed so both overloads (whose trailing `TupleGuard` arity differs)\n // stay assignable to this implementation signature.\n ...rest: readonly unknown[]\n): Result<readonly unknown[], unknown> {\n const combineErrors = rest[0] as ((left: unknown, right: unknown) => unknown) | undefined;\n // Runtime identical to validateAll; the overloads restore per-index tuple types.\n return combineErrors ? validateAll(results, combineErrors) : validateAll(results);\n}\n","/** @deprecated Migration shim — prefer `@onrails/result` and `@onrails/result/fluent`. */\nimport { ResultAsync as CoreResultAsync } from \"../async.js\";\nimport { combineTuple } from \"../collections.js\";\nimport { mkErr as coreErr, mkOk as coreOk } from \"../internal/ctor.js\";\nimport type { InferErr, InferOk } from \"../internal/infer.js\";\nimport { flatMap, fromThrowable, isErr, isOk, map, mapErr, unwrapOr } from \"../result.js\";\nimport type { Result as ResultType } from \"../types.js\";\n\ntype TupleOk<R extends readonly CompatResult<unknown, unknown>[]> = {\n [K in keyof R]: R[K] extends CompatResult<infer T, unknown> ? T : never;\n};\ntype TupleErr<R extends readonly CompatResult<unknown, unknown>[]> = {\n [K in keyof R]: R[K] extends CompatResult<unknown, infer F> ? F : never;\n}[number];\n\ntype AsyncTupleOk<R extends readonly CompatResultAsync<unknown, unknown>[]> = {\n [K in keyof R]: R[K] extends CompatResultAsync<infer T, unknown> ? T : never;\n};\ntype AsyncTupleErr<R extends readonly CompatResultAsync<unknown, unknown>[]> = {\n [K in keyof R]: R[K] extends CompatResultAsync<unknown, infer F> ? F : never;\n}[number];\n\nexport class CompatResult<T, E> {\n constructor(readonly inner: ResultType<T, E>) {}\n\n static fromThrowable<A extends readonly unknown[], U, F>(\n fn: (...args: A) => U,\n onThrow: (error: unknown) => F,\n ): (...args: A) => CompatResult<U, F> {\n const wrapped = fromThrowable(fn, onThrow);\n return (...args: A) => new CompatResult(wrapped(...args));\n }\n\n static combine<const R extends readonly CompatResult<unknown, unknown>[]>(\n results: R,\n ): CompatResult<TupleOk<R>, TupleErr<R>> {\n return new CompatResult(\n combineTuple(results.map((r) => r.inner)) as ResultType<TupleOk<R>, TupleErr<R>>,\n );\n }\n\n get value(): T {\n return this._unsafeUnwrap();\n }\n\n get error(): E {\n return this._unsafeUnwrapErr();\n }\n\n isOk(): boolean {\n return isOk(this.inner);\n }\n\n isErr(): boolean {\n return isErr(this.inner);\n }\n\n map<U>(fn: (value: T) => U): CompatResult<U, E> {\n return new CompatResult(map(this.inner, fn));\n }\n\n mapErr<F>(fn: (error: E) => F): CompatResult<T, F> {\n return new CompatResult(mapErr(this.inner, fn));\n }\n\n andThen<U, F = E>(fn: (value: T) => CompatResult<U, F>): CompatResult<U, E | F> {\n return new CompatResult(flatMap(this.inner, (value) => fn(value).inner));\n }\n\n asyncAndThen<U, F = E>(\n fn: (value: T) => CompatResultAsync<U, F> | CoreResultAsync<U, F>,\n ): CompatResultAsync<U, E | F> {\n return isErr(this.inner)\n ? CompatResultAsync.err(this.inner.error)\n : CompatResultAsync.fromInner(coerceToCoreAsync(fn(this.inner.value)));\n }\n\n orElse<F>(fn: (error: E) => CompatResult<T, F>): CompatResult<T, F> {\n return isOk(this.inner) ? new CompatResult<T, F>(this.inner) : fn(this.inner.error);\n }\n\n match<U1, U2 = U1>(onOk: (value: T) => U1, onErr: (error: E) => U2): U1 | U2 {\n return isOk(this.inner) ? onOk(this.inner.value) : onErr(this.inner.error);\n }\n\n unwrapOr<U>(defaultValue: U): T | U {\n return unwrapOr(this.inner as ResultType<T | U, E>, defaultValue);\n }\n\n _unsafeUnwrap(): T {\n if (isErr(this.inner)) {\n throw new Error(\"Called _unsafeUnwrap on Err\");\n }\n return this.inner.value;\n }\n\n _unsafeUnwrapErr(): E {\n if (isOk(this.inner)) {\n throw new Error(\"Called _unsafeUnwrapErr on Ok\");\n }\n return this.inner.error;\n }\n}\n\nexport const Result = CompatResult;\nexport type Result<T, E> = CompatResult<T, E>;\n\nexport const ok = <T, E = never>(value: T): CompatResult<T, E> => new CompatResult(coreOk(value));\nexport const err = <T = never, E = unknown>(error: E): CompatResult<T, E> =>\n new CompatResult(coreErr(error));\n\n/** `await` yields `CompatResult` so `.isOk()` / `.value` / `.match()` work without `.resolve()`. */\nexport class CompatResultAsync<T, E> implements PromiseLike<CompatResult<T, E>> {\n private constructor(private readonly inner: CoreResultAsync<T, E>) {}\n\n static fromInner<T, E>(inner: CoreResultAsync<T, E>): CompatResultAsync<T, E> {\n return new CompatResultAsync(inner);\n }\n\n toCore(): CoreResultAsync<T, E> {\n return this.inner;\n }\n\n static ok<T, E = never>(value: T): CompatResultAsync<T, E> {\n return new CompatResultAsync(CoreResultAsync.ok<T, E>(value));\n }\n\n static err<T = never, E = unknown>(error: E): CompatResultAsync<T, E> {\n return new CompatResultAsync(CoreResultAsync.err<T, E>(error));\n }\n\n static fromPromise<T, E>(\n promise: PromiseLike<T>,\n onReject: (error: unknown) => E,\n ): CompatResultAsync<T, E> {\n return new CompatResultAsync(CoreResultAsync.fromPromise(promise, onReject));\n }\n\n static fromSafePromise<T, E = never>(promise: PromiseLike<T>): CompatResultAsync<T, E> {\n return new CompatResultAsync(CoreResultAsync.fromSafePromise<T, E>(promise));\n }\n\n static fromThrowable<A extends readonly unknown[], U, F>(\n fn: (...args: A) => Promise<U>,\n onThrow: (error: unknown) => F,\n ): (...args: A) => CompatResultAsync<U, F> {\n return (...args: A) => CompatResultAsync.fromPromise(fn(...args), onThrow);\n }\n\n static combine<const R extends readonly CompatResultAsync<unknown, unknown>[]>(\n results: R,\n ): CompatResultAsync<AsyncTupleOk<R>, AsyncTupleErr<R>> {\n return new CompatResultAsync(\n CoreResultAsync.combine(results.map((r) => r.inner)) as CoreResultAsync<\n AsyncTupleOk<R>,\n AsyncTupleErr<R>\n >,\n );\n }\n\n // biome-ignore lint/suspicious/noThenProperty: thenable shim for `await ra` -> CompatResult\n then<R1 = CompatResult<T, E>, R2 = never>(\n onfulfilled?: ((value: CompatResult<T, E>) => R1 | PromiseLike<R1>) | undefined | null,\n onrejected?: ((reason: unknown) => R2 | PromiseLike<R2>) | undefined | null,\n ): Promise<R1 | R2> {\n return this.inner.resolve().then((r) => {\n const wrapped = new CompatResult(r);\n // Safe: without onfulfilled, R1 stays at its CompatResult<T, E> default.\n return onfulfilled ? onfulfilled(wrapped) : (wrapped as unknown as R1);\n }, onrejected ?? undefined);\n }\n\n resolve(): Promise<ResultType<T, E>> {\n return this.inner.resolve();\n }\n\n map<U>(fn: (value: T) => U): CompatResultAsync<U, E> {\n return new CompatResultAsync(this.inner.map(fn));\n }\n\n mapErr<F>(fn: (error: E) => F): CompatResultAsync<T, F> {\n return new CompatResultAsync(this.inner.mapErr(fn));\n }\n\n andThen<R extends AnyAsyncOrSyncResult>(\n fn: (value: T) => R,\n ): CompatResultAsync<UnwrapOk<R>, E | UnwrapErr<R>> {\n return new CompatResultAsync(this.inner.andThen((value) => coerceToCore(fn(value))));\n }\n\n chain<R extends AnyAsyncOrSyncResult>(fn: (value: T) => R) {\n return this.andThen(fn);\n }\n\n flatMap<R extends AnyAsyncOrSyncResult>(fn: (value: T) => R) {\n return this.andThen(fn);\n }\n\n orElse<R extends AnyAsyncOrSyncResult>(\n fn: (error: E) => R,\n ): CompatResultAsync<T | UnwrapOk<R>, UnwrapErr<R>> {\n return new CompatResultAsync(\n this.inner.orElse(\n (error) =>\n coerceToCore(fn(error)) as CoreResultAsync<T, UnwrapErr<R>> | ResultType<T, UnwrapErr<R>>,\n ) as CoreResultAsync<T | UnwrapOk<R>, UnwrapErr<R>>,\n );\n }\n\n unwrapOr<U>(defaultValue: U): Promise<T | U> {\n return this.inner.unwrapOr(defaultValue);\n }\n\n isOk(): Promise<boolean> {\n return this.inner.match(\n () => true,\n () => false,\n );\n }\n\n isErr(): Promise<boolean> {\n return this.inner.match(\n () => false,\n () => true,\n );\n }\n\n match<U1, U2 = U1>(onOk: (value: T) => U1, onErr: (error: E) => U2): Promise<U1 | U2> {\n return this.inner.match(onOk, onErr);\n }\n\n andTee(fn: (value: T) => void | Promise<void>): CompatResultAsync<T, E> {\n return new CompatResultAsync(\n CoreResultAsync.defer(async () => {\n const r = await this.inner.resolve();\n if (!isErr(r)) {\n try {\n await fn(r.value);\n } catch {\n // andTee ignores tee failures (neverthrow semantics).\n }\n }\n return r;\n }),\n );\n }\n\n orTee(fn: (error: E) => void | Promise<void>): CompatResultAsync<T, E> {\n return new CompatResultAsync(\n CoreResultAsync.defer(async () => {\n const r = await this.inner.resolve();\n if (isErr(r)) {\n try {\n await fn(r.error);\n } catch {\n // orTee ignores tee failures (neverthrow semantics).\n }\n }\n return r;\n }),\n );\n }\n}\n\ntype AnyAsyncOrSyncResult =\n | CompatResultAsync<unknown, unknown>\n | CoreResultAsync<unknown, unknown>\n | CompatResult<unknown, unknown>\n | ResultType<unknown, unknown>;\n\n// Compat wrappers first (they hide the payload behind `inner`), then the\n// shared extractor handles core Result / ResultAsync.\ntype UnwrapOk<R> =\n R extends CompatResultAsync<infer U, unknown>\n ? U\n : R extends CompatResult<infer U, unknown>\n ? U\n : InferOk<R>;\n\ntype UnwrapErr<R> =\n R extends CompatResultAsync<unknown, infer F>\n ? F\n : R extends CompatResult<unknown, infer F>\n ? F\n : InferErr<R>;\n\nfunction coerceToCore<R extends AnyAsyncOrSyncResult>(\n next: R,\n): CoreResultAsync<UnwrapOk<R>, UnwrapErr<R>> | ResultType<UnwrapOk<R>, UnwrapErr<R>>;\nfunction coerceToCore(\n next: AnyAsyncOrSyncResult,\n): CoreResultAsync<unknown, unknown> | ResultType<unknown, unknown> {\n if (next instanceof CompatResultAsync) return next.toCore();\n if (next instanceof CoreResultAsync) return next;\n if (next instanceof CompatResult) return next.inner;\n return next;\n}\n\n/** Async-only coercion — keeps {@link CompatResult.asyncAndThen} cast-free. */\nconst coerceToCoreAsync = <U, F>(\n next: CompatResultAsync<U, F> | CoreResultAsync<U, F>,\n): CoreResultAsync<U, F> => (next instanceof CompatResultAsync ? next.toCore() : next);\n\nexport { CompatResultAsync as ResultAsync };\n\nexport const okAsync = CompatResultAsync.ok;\nexport const errAsync = CompatResultAsync.err;\nexport const fromPromise = CompatResultAsync.fromPromise;\nexport const fromSafePromise = CompatResultAsync.fromSafePromise;\n"]}
package/dist/extra.cjs CHANGED
@@ -1,6 +1,8 @@
1
1
  'use strict';
2
2
 
3
- // src/internal/dual.ts
3
+ // src/internal/ctor.ts
4
+
5
+ // src/result.ts
4
6
  var isOk = (result) => result._tag === "Ok";
5
7
  var isErr = (result) => result._tag === "Err";
6
8