@onrails/result 0.4.2 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DESIGN.md +12 -1
- package/README.md +45 -1
- package/dist/compat/neverthrow.cjs +234 -48
- package/dist/compat/neverthrow.cjs.map +1 -1
- package/dist/compat/neverthrow.d.cts +38 -4
- package/dist/compat/neverthrow.d.ts +38 -4
- package/dist/compat/neverthrow.js +230 -49
- package/dist/compat/neverthrow.js.map +1 -1
- package/dist/extra.cjs +43 -2
- package/dist/extra.cjs.map +1 -1
- package/dist/extra.js +43 -2
- package/dist/extra.js.map +1 -1
- package/dist/fluent.cjs +88 -14
- package/dist/fluent.cjs.map +1 -1
- package/dist/fluent.js +88 -14
- package/dist/fluent.js.map +1 -1
- package/dist/index.cjs +120 -37
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +120 -38
- package/dist/index.js.map +1 -1
- package/dist/internal/ctor.d.cts +8 -8
- package/dist/internal/ctor.d.ts +8 -8
- package/dist/internal/proto.d.cts +3 -0
- package/dist/internal/proto.d.ts +3 -0
- package/dist/railway.cjs +105 -31
- package/dist/railway.cjs.map +1 -1
- package/dist/railway.js +105 -31
- package/dist/railway.js.map +1 -1
- package/dist/try-gen.cjs +43 -6
- package/dist/try-gen.cjs.map +1 -1
- package/dist/try-gen.js +43 -6
- package/dist/try-gen.js.map +1 -1
- package/dist/types.d.cts +67 -9
- package/dist/types.d.ts +67 -9
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
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. Internals must never narrow a payload type, so they build results\n * 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 { Payload } from \"./internal/payload.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(v); // generic T passes through\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>`), and an array literal\n * stays a mutable tuple (`ok([1, 2])` satisfies `Result<number[], E>`). A\n * generic `T` always comes back as `T`. Passing both type arguments opts out\n * of locking entirely.\n */\nexport function ok<const T extends Payload[]>(value: T): Result<T, never>;\nexport function ok<const T>(value: T): Result<T, never>;\nexport function ok<T, E>(value: T): Result<T, E>;\nexport function ok<T>(value: T): Result<T, never> {\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. Inference locks literals the same way as {@link ok}, and a generic\n * `E` always comes back as `E`.\n */\nexport function err<const E extends Payload[]>(error: E): Result<never, E>;\nexport function err<const E>(error: E): Result<never, E>;\nexport function err<T, E>(error: E): Result<T, E>;\nexport function err<E>(error: E): Result<never, E> {\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 { Payload } from \"./internal/payload.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 extends Payload[]>(value: T): ResultAsync<T, never>;\n static ok<const 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 () => 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 extends Payload[]>(value: T): ResultAsync<T, never>;\n static of<const 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<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 extends Payload[]>(error: E): ResultAsync<never, E>;\n static err<const E>(error: E): ResultAsync<never, 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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/internal/proto.ts","../../src/internal/dual.ts","../../src/result.ts","../../src/types.ts","../../src/async.ts","../../src/collections.ts","../../src/compat/neverthrow.ts"],"names":["fromThrowable"],"mappings":"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","file":"neverthrow.js","sourcesContent":["import type { Result, ResultMethods } from \"../types.js\";\n\n/**\n * `util.inspect` / `Bun.inspect` / `console.log` hook: render `Ok(1)` instead of dumping the class\n * name and every prototype method. Symbol-keyed, so it adds no enumerable field and JSON is unchanged.\n */\nconst INSPECT = Symbol.for(\"nodejs.util.inspect.custom\");\ntype Inspect = (value: unknown, options?: unknown) => string;\n\n/**\n * Live carrier classes. `_tag` and `value` / `error` are own enumerable\n * fields, so JSON and `structuredClone` see plain data; every method lives on\n * the prototype and is therefore non-enumerable.\n *\n * Internal only: reach carriers through {@link newOk} / {@link newErr}\n * (aliased as `mkOk` / `mkErr` for unlocked internals) or the public\n * `ok` / `err`.\n */\nclass OkImpl<T, E> implements ResultMethods<T, E> {\n readonly _tag: \"Ok\";\n readonly value: T;\n // explicit assignment order keeps `_tag` first, so JSON key order matches the plain-data shape\n constructor(value: T) {\n this._tag = \"Ok\";\n this.value = value;\n }\n [INSPECT](_depth: number, options: unknown, inspect: Inspect): string {\n return `Ok(${inspect(this.value, options)})`;\n }\n map<U>(fn: (value: T) => U): Result<U, E> {\n return new OkImpl<U, E>(fn(this.value));\n }\n mapErr<F>(_fn: (error: E) => F): Result<T, F> {\n return new OkImpl<T, F>(this.value);\n }\n flatMap<U, F>(fn: (value: T) => Result<U, F>): Result<U, E | F> {\n return fn(this.value);\n }\n andThen<U, F>(fn: (value: T) => Result<U, F>): Result<U, E | F> {\n return fn(this.value);\n }\n recover<F>(_fn: (error: E) => Result<T, F>): Result<T, F> {\n return new OkImpl<T, F>(this.value);\n }\n tap(fn: (value: T) => void): Result<T, E> {\n fn(this.value);\n return this;\n }\n tapErr(_fn: (error: E) => void): Result<T, E> {\n return this;\n }\n match<U>(onOk: (value: T) => U, _onErr: (error: E) => U): U {\n return onOk(this.value);\n }\n unwrapOr<U>(_defaultValue: U): T | U {\n return this.value;\n }\n}\n\nclass ErrImpl<T, E> implements ResultMethods<T, E> {\n readonly _tag: \"Err\";\n readonly error: E;\n constructor(error: E) {\n this._tag = \"Err\";\n this.error = error;\n }\n [INSPECT](_depth: number, options: unknown, inspect: Inspect): string {\n return `Err(${inspect(this.error, options)})`;\n }\n map<U>(_fn: (value: T) => U): Result<U, E> {\n return new ErrImpl<U, E>(this.error);\n }\n mapErr<F>(fn: (error: E) => F): Result<T, F> {\n return new ErrImpl<T, F>(fn(this.error));\n }\n flatMap<U, F>(_fn: (value: T) => Result<U, F>): Result<U, E | F> {\n return new ErrImpl<U, E | F>(this.error);\n }\n andThen<U, F>(_fn: (value: T) => Result<U, F>): Result<U, E | F> {\n return new ErrImpl<U, E | F>(this.error);\n }\n recover<F>(fn: (error: E) => Result<T, F>): Result<T, F> {\n return fn(this.error);\n }\n tap(_fn: (value: T) => void): Result<T, E> {\n return this;\n }\n tapErr(fn: (error: E) => void): Result<T, E> {\n fn(this.error);\n return this;\n }\n match<U>(_onOk: (value: T) => U, onErr: (error: E) => U): U {\n return onErr(this.error);\n }\n unwrapOr<U>(defaultValue: U): T | U {\n return defaultValue;\n }\n}\n\nexport const newOk = <T, E>(value: T): Result<T, E> => new OkImpl<T, E>(value);\nexport const newErr = <T, E>(error: E): Result<T, E> => new ErrImpl<T, E>(error);\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 { Payload } from \"./internal/payload.js\";\nimport { newErr, newOk } from \"./internal/proto.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(v); // generic T passes through\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>`), and an array literal\n * stays a mutable tuple (`ok([1, 2])` satisfies `Result<number[], E>`). A\n * generic `T` always comes back as `T`. Passing both type arguments opts out\n * of locking entirely.\n */\nexport function ok<const T extends Payload[]>(value: T): Result<T, never>;\nexport function ok<const T>(value: T): Result<T, never>;\nexport function ok<T, E>(value: T): Result<T, E>;\nexport function ok<T>(value: T): Result<T, never> {\n // Direct carrier construct — skip the unlocked `mkOk` alias hop on the hot path.\n return newOk(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. Inference locks literals the same way as {@link ok}, and a generic\n * `E` always comes back as `E`.\n */\nexport function err<const E extends Payload[]>(error: E): Result<never, E>;\nexport function err<const E>(error: E): Result<never, E>;\nexport function err<T, E>(error: E): Result<T, E>;\nexport function err<E>(error: E): Result<never, E> {\n // Direct carrier construct — skip the unlocked `mkErr` alias hop on the hot path.\n return newErr(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","import { mkErr, mkOk } from \"./internal/ctor.js\";\n\n/**\n * Plain-data shape of a {@link Result}: what `JSON.parse`, `structuredClone`\n * and `postMessage` hand back. It has no methods; lift it with `Result.from`.\n */\nexport type ResultData<T, E> =\n | { readonly _tag: \"Ok\"; readonly value: T }\n | { readonly _tag: \"Err\"; readonly error: E };\n\n/**\n * Methods every live {@link Result} carries on its (non-enumerable) prototype.\n * Core semantics: `tap` does not swallow throws, `recover` keeps the `Ok` type.\n * Method syntax keeps the type parameters bivariant, so `Result<T, never>` is\n * assignable to `Result<T, E>`.\n */\nexport interface ResultMethods<T, E> {\n /** Transform the `Ok` value; `Err` passes through. */\n map<U>(fn: (value: T) => U): Result<U, E>;\n /** Transform the `Err` value; `Ok` passes through. */\n mapErr<F>(fn: (error: E) => F): Result<T, F>;\n /** Canonical bind; widens the error union and short-circuits on `Err`. */\n flatMap<U, F>(fn: (value: T) => Result<U, F>): Result<U, E | F>;\n /** Alias of {@link ResultMethods.flatMap} for neverthrow muscle memory. */\n andThen<U, F>(fn: (value: T) => Result<U, F>): Result<U, E | F>;\n /** Error-track bind; recover to `Ok` or remap the failure. */\n recover<F>(fn: (error: E) => Result<T, F>): Result<T, F>;\n /** Observe the `Ok` value, pass the result through. */\n tap(fn: (value: T) => void): Result<T, E>;\n /** Observe the `Err` value, pass the result through. */\n tapErr(fn: (error: E) => void): Result<T, E>;\n /** Fold both tracks into one value. */\n match<U>(onOk: (value: T) => U, onErr: (error: E) => U): U;\n /** The `Ok` value, or `defaultValue` on `Err`. */\n unwrapOr<U>(defaultValue: U): T | U;\n}\n\n/**\n * The core railway type: a tagged union carrying either a success value\n * (`Ok<T>`) or a failure value (`Err<E>`), discriminated on `_tag`. Carriers\n * are plain data (`_tag` plus `value` / `error` as own enumerable properties)\n * with {@link ResultMethods} on a shared non-enumerable prototype, so\n * `JSON.stringify` output is unchanged. Narrow on `_tag` to read\n * `.value` / `.error`.\n *\n * Build carriers with `ok` / `err`; a hand-written `{ _tag: \"Ok\", value }`\n * literal has no methods and is not a `Result`. Data that crossed a\n * serialization boundary is lifted back with `Result.from`.\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 * parse(\"1\").map((n) => n + 1);\n * ```\n */\nexport type Result<T, E> = ResultData<T, E> & ResultMethods<T, E>;\n\n/**\n * Value-side companion of the {@link Result} type.\n *\n * `from` lifts plain data back into a live `Result`. Use it at every\n * deserialization sink (`JSON.parse`, `structuredClone`, `postMessage`,\n * IndexedDB, Redux rehydration), where the prototype and its methods are lost\n * while the type still claims them. It trusts the shape; validate untrusted\n * input first. An unknown `_tag` is a defect and throws a `TypeError` rather\n * than becoming a silent `Err(undefined)`.\n *\n * @example\n * ```ts\n * const wire = JSON.parse(JSON.stringify(ok(1))); // plain data, no methods\n * const live = Result.from<number, string>(wire); // Result<number, string>\n * live.map((n) => n + 1);\n * ```\n */\nexport const Result = {\n from: <T, E>(data: ResultData<T, E>): Result<T, E> => {\n if (data._tag === \"Ok\") return mkOk<T, E>(data.value);\n if (data._tag === \"Err\") return mkErr<T, E>(data.error);\n throw new TypeError(`Result.from: unknown _tag ${String((data as { _tag?: unknown })._tag)}`);\n },\n} as const;\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 { Payload } from \"./internal/payload.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 extends Payload[]>(value: T): ResultAsync<T, never>;\n static ok<const 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 () => 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 extends Payload[]>(value: T): ResultAsync<T, never>;\n static of<const 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<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 extends Payload[]>(error: E): ResultAsync<never, E>;\n static err<const E>(error: E): ResultAsync<never, 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 mkErr(first.error);\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 mkOk(first.value);\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 // `unknown` hop: the tuple type is computed from R, which TS cannot relate to the runtime array.\n combine(results as readonly AnyResult[]) as 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 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, validateAll } from \"../collections.js\";\nimport { mkErr as coreErr, mkOk as coreOk } from \"../internal/ctor.js\";\nimport type { InferErr, InferOk } from \"../internal/infer.js\";\nimport { fromThrowable as coreFromThrowable, isErr, isOk } 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\n/** Narrowed by {@link CompatResult.isOk} — exposes `value`. */\nexport type CompatOk<T, E> = CompatResult<T, E> & { readonly value: T };\n/** Narrowed by {@link CompatResult.isErr} — exposes `error`. */\nexport type CompatErr<T, E> = CompatResult<T, E> & { readonly error: E };\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 = coreFromThrowable(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 unknown as ResultType<TupleOk<R>, TupleErr<R>>,\n );\n }\n\n // The `as unknown as` casts below restore per-index tuple types computed from R, which TS cannot\n // relate to the runtime arrays.\n static combineWithAllErrors<const R extends readonly CompatResult<unknown, unknown>[]>(\n results: R,\n ): CompatResult<TupleOk<R>, TupleErr<R>[]> {\n return new CompatResult(\n validateAll(results.map((r) => r.inner)) as unknown as ResultType<TupleOk<R>, TupleErr<R>[]>,\n );\n }\n\n isOk(): this is CompatOk<T, E> {\n return isOk(this.inner);\n }\n\n isErr(): this is CompatErr<T, E> {\n return isErr(this.inner);\n }\n\n map<U>(fn: (value: T) => U): CompatResult<U, E> {\n return new CompatResult(this.inner.map(fn));\n }\n\n mapErr<F>(fn: (error: E) => F): CompatResult<T, F> {\n return new CompatResult(this.inner.mapErr(fn));\n }\n\n andThen<U, F = E>(fn: (value: T) => CompatResult<U, F>): CompatResult<U, E | F> {\n return new CompatResult(this.inner.flatMap((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)\n ? new CompatResult<T, F>(coreOk(this.inner.value))\n : 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 this.inner.unwrapOr(defaultValue);\n }\n\n andTee(fn: (value: T) => unknown): CompatResult<T, E> {\n if (isOk(this.inner)) {\n try {\n fn(this.inner.value);\n } catch {\n // andTee ignores tee failures (neverthrow semantics).\n }\n }\n return this;\n }\n\n orTee(fn: (error: E) => unknown): CompatResult<T, E> {\n if (isErr(this.inner)) {\n try {\n fn(this.inner.error);\n } catch {\n // orTee ignores tee failures (neverthrow semantics).\n }\n }\n return this;\n }\n\n andThrough<F>(fn: (value: T) => CompatResult<unknown, F>): CompatResult<T, E | F> {\n if (isErr(this.inner)) return this;\n const through = fn(this.inner.value).inner;\n return isErr(through) ? new CompatResult<T, E | F>(coreErr(through.error)) : this;\n }\n\n asyncAndThrough<F>(\n fn: (value: T) => CompatResultAsync<unknown, F> | CoreResultAsync<unknown, F>,\n ): CompatResultAsync<T, E | F> {\n const inner = this.inner;\n return CompatResultAsync.fromInner(\n CoreResultAsync.defer(async (): Promise<ResultType<T, E | F>> => {\n if (isErr(inner)) return inner;\n const through = await coerceToCoreAsync(fn(inner.value)).resolve();\n return isErr(through) ? coreErr(through.error) : inner;\n }),\n );\n }\n\n asyncMap<U>(fn: (value: T) => Promise<U>): CompatResultAsync<U, E> {\n return isErr(this.inner)\n ? CompatResultAsync.err(this.inner.error)\n : CompatResultAsync.fromSafePromise(fn(this.inner.value));\n }\n\n /** Yields the `Err` to {@link safeTry} on failure; returns the `Ok` value otherwise. */\n *safeUnwrap(): Generator<CompatResult<never, E>, T, unknown> {\n if (isErr(this.inner)) {\n yield new CompatResult<never, E>(coreErr(this.inner.error));\n }\n // Only reachable on Err when driven outside safeTry — same failure neverthrow raises.\n return this._unsafeUnwrap();\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// `value` / `error` are installed on the prototype rather than declared in the class body so the\n// plain `CompatResult` type hides them until `isOk()` / `isErr()` narrows, as with neverthrow.\nObject.defineProperty(CompatResult.prototype, \"value\", {\n get(this: CompatResult<unknown, unknown>) {\n return this._unsafeUnwrap();\n },\n});\nObject.defineProperty(CompatResult.prototype, \"error\", {\n get(this: CompatResult<unknown, unknown>) {\n return this._unsafeUnwrapErr();\n },\n});\n\n/** `instanceof Ok` matches any `CompatResult` holding a value, as neverthrow's `Ok` class does. */\nexport class Ok<T, E> extends CompatResult<T, E> {\n declare readonly value: T;\n constructor(value: T) {\n super(coreOk(value));\n }\n static [Symbol.hasInstance](candidate: unknown): boolean {\n return candidate instanceof CompatResult && isOk(candidate.inner);\n }\n}\n\n/** `instanceof Err` matches any `CompatResult` holding an error, as neverthrow's `Err` class does. */\nexport class Err<T, E> extends CompatResult<T, E> {\n declare readonly error: E;\n constructor(error: E) {\n super(coreErr(error));\n }\n static [Symbol.hasInstance](candidate: unknown): boolean {\n return candidate instanceof CompatResult && isErr(candidate.inner);\n }\n}\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 static combineWithAllErrors<const R extends readonly CompatResultAsync<unknown, unknown>[]>(\n results: R,\n ): CompatResultAsync<AsyncTupleOk<R>, AsyncTupleErr<R>[]> {\n return new CompatResultAsync(\n CoreResultAsync.defer(\n async () =>\n validateAll(await Promise.all(results.map((r) => r.resolve()))) as unknown as ResultType<\n AsyncTupleOk<R>,\n AsyncTupleErr<R>[]\n >,\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 andThrough<R extends AnyAsyncOrSyncResult>(\n fn: (value: T) => R,\n ): CompatResultAsync<T, E | UnwrapErr<R>> {\n return new CompatResultAsync(\n CoreResultAsync.defer(async (): Promise<ResultType<T, E | UnwrapErr<R>>> => {\n const r = await this.inner.resolve();\n if (isErr(r)) return r;\n const next = coerceToCore(fn(r.value));\n const through = next instanceof CoreResultAsync ? await next.resolve() : next;\n return isErr(through) ? coreErr(through.error) : r;\n }),\n );\n }\n\n /** Async twin of {@link CompatResult.safeUnwrap}. */\n async *safeUnwrap(): AsyncGenerator<CompatResult<never, E>, T, unknown> {\n return yield* new CompatResult(await this.inner.resolve()).safeUnwrap();\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 function safeTry<T, E>(\n body: () => Generator<CompatResult<never, E>, CompatResult<T, E>, unknown>,\n): CompatResult<T, E>;\nexport function safeTry<T, E>(\n body: () => AsyncGenerator<CompatResult<never, E>, CompatResult<T, E>, unknown>,\n): CompatResultAsync<T, E>;\nexport function safeTry<T, E>(\n body: () =>\n | Generator<CompatResult<never, E>, CompatResult<T, E>, unknown>\n | AsyncGenerator<CompatResult<never, E>, CompatResult<T, E>, unknown>,\n): CompatResult<T, E> | CompatResultAsync<T, E> {\n // A yielded Err and the returned Result both end the first step, so one `next()` decides the outcome.\n const step = body().next();\n if (step instanceof Promise) {\n return CompatResultAsync.fromInner(CoreResultAsync.defer(async () => (await step).value.inner));\n }\n return step.value;\n}\n\nexport const okAsync = CompatResultAsync.ok;\nexport const errAsync = CompatResultAsync.err;\nexport const fromPromise = CompatResultAsync.fromPromise;\nexport const fromSafePromise = CompatResultAsync.fromSafePromise;\n\nexport const fromThrowable = CompatResult.fromThrowable;\nexport const fromAsyncThrowable = CompatResultAsync.fromThrowable;\n"]}
|
package/dist/extra.cjs
CHANGED
|
@@ -1,6 +1,47 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
// src/internal/
|
|
3
|
+
// src/internal/proto.ts
|
|
4
|
+
var INSPECT = /* @__PURE__ */ Symbol.for("nodejs.util.inspect.custom");
|
|
5
|
+
var ErrImpl = class _ErrImpl {
|
|
6
|
+
_tag;
|
|
7
|
+
error;
|
|
8
|
+
constructor(error) {
|
|
9
|
+
this._tag = "Err";
|
|
10
|
+
this.error = error;
|
|
11
|
+
}
|
|
12
|
+
[INSPECT](_depth, options, inspect) {
|
|
13
|
+
return `Err(${inspect(this.error, options)})`;
|
|
14
|
+
}
|
|
15
|
+
map(_fn) {
|
|
16
|
+
return new _ErrImpl(this.error);
|
|
17
|
+
}
|
|
18
|
+
mapErr(fn) {
|
|
19
|
+
return new _ErrImpl(fn(this.error));
|
|
20
|
+
}
|
|
21
|
+
flatMap(_fn) {
|
|
22
|
+
return new _ErrImpl(this.error);
|
|
23
|
+
}
|
|
24
|
+
andThen(_fn) {
|
|
25
|
+
return new _ErrImpl(this.error);
|
|
26
|
+
}
|
|
27
|
+
recover(fn) {
|
|
28
|
+
return fn(this.error);
|
|
29
|
+
}
|
|
30
|
+
tap(_fn) {
|
|
31
|
+
return this;
|
|
32
|
+
}
|
|
33
|
+
tapErr(fn) {
|
|
34
|
+
fn(this.error);
|
|
35
|
+
return this;
|
|
36
|
+
}
|
|
37
|
+
match(_onOk, onErr) {
|
|
38
|
+
return onErr(this.error);
|
|
39
|
+
}
|
|
40
|
+
unwrapOr(defaultValue) {
|
|
41
|
+
return defaultValue;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
var newErr = (error) => new ErrImpl(error);
|
|
4
45
|
|
|
5
46
|
// src/result.ts
|
|
6
47
|
var isOk = (result) => result._tag === "Ok";
|
|
@@ -12,7 +53,7 @@ var declareErrors = () => ({
|
|
|
12
53
|
annotateAsync: (result) => result
|
|
13
54
|
});
|
|
14
55
|
var hasKind = (error, kind) => error.kind === kind;
|
|
15
|
-
var mapErrKind = (kind, fn) => (result) => isErr(result) && hasKind(result.error, kind) ?
|
|
56
|
+
var mapErrKind = (kind, fn) => (result) => isErr(result) && hasKind(result.error, kind) ? newErr(fn(result.error)) : result;
|
|
16
57
|
var allOk = (results) => results.every(isOk);
|
|
17
58
|
|
|
18
59
|
exports.allOk = allOk;
|
package/dist/extra.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/result.ts","../src/extra.ts"],"names":[],"mappings":";;;;;AA+EO,IAAM,IAAA,GAAO,CAAO,MAAA,KAA6C,MAAA,CAAO,IAAA,KAAS,IAAA;AAYjF,IAAM,KAAA,GAAQ,CAAO,MAAA,KAA8C,MAAA,CAAO,IAAA,KAAS,KAAA;;;AC3DnF,IAAM,gBAAgB,OAAU;AAAA,EACrC,QAAA,EAAU,CAAI,MAAA,KAA6C,MAAA;AAAA,EAC3D,aAAA,EAAe,CAAI,MAAA,KACjB;AACJ,CAAA;AAGO,IAAM,OAAA,GAAU,CACrB,KAAA,EACA,IAAA,KACqC,MAAM,IAAA,KAAS;AAG/C,IAAM,UAAA,GACX,CACE,IAAA,EACA,EAAA,KAEF,CAAI,MAAA,KACF,KAAA,CAAM,MAAM,CAAA,IAAK,OAAA,CAAQ,MAAA,CAAO,OAAO,IAAI,CAAA,GACvC,EAAE,IAAA,EAAM,KAAA,EAAO,OAAO,EAAA,CAAG,MAAA,CAAO,KAAK,CAAA,EAAE,GACvC;AAGD,IAAM,KAAA,GAAQ,CAAO,OAAA,KAA8C,OAAA,CAAQ,MAAM,IAAI","file":"extra.cjs","sourcesContent":["import { mkErr, mkOk } from \"./internal/ctor.js\";\nimport { dual } from \"./internal/dual.js\";\nimport type { Payload } from \"./internal/payload.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(v); // generic T passes through\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>`), and an array literal\n * stays a mutable tuple (`ok([1, 2])` satisfies `Result<number[], E>`). A\n * generic `T` always comes back as `T`. Passing both type arguments opts out\n * of locking entirely.\n */\nexport function ok<const T extends Payload[]>(value: T): Result<T, never>;\nexport function ok<const T>(value: T): Result<T, never>;\nexport function ok<T, E>(value: T): Result<T, E>;\nexport function ok<T>(value: T): Result<T, never> {\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. Inference locks literals the same way as {@link ok}, and a generic\n * `E` always comes back as `E`.\n */\nexport function err<const E extends Payload[]>(error: E): Result<never, E>;\nexport function err<const E>(error: E): Result<never, E>;\nexport function err<T, E>(error: E): Result<T, E>;\nexport function err<E>(error: E): Result<never, E> {\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 * @onrails/result/extra — tagged-error helpers.\n */\n\nimport type { ResultAsync } from \"./async.js\";\nimport type { InferErr, InferOk } from \"./internal/infer.js\";\nimport { isErr, isOk } from \"./result.js\";\nimport type { Result } from \"./types.js\";\n\n/** Extract error type from a {@link Result} — alias of {@link InferErr} */\nexport type ErrOf<R> = InferErr<R>;\n\n/** Extract success type from a {@link Result} — alias of {@link InferOk} */\nexport type OkOf<R> = InferOk<R>;\n\n/** Union of error types from a tuple/readonly array of results */\nexport type UnionErrors<R extends readonly Result<unknown, unknown>[]> = {\n [K in keyof R]: ErrOf<R[K]>;\n}[number];\n\n/** Manual union when TS fails to infer multi-step errors (neverthrow #603) */\nexport type AccumulateErrors<Errors extends readonly unknown[]> = Errors[number];\n\n/**\n * Declare the error union for a pipeline when inference only picks the first step.\n *\n * @example\n * ```ts\n * const errors = declareErrors<ParseError | NetworkError>();\n * const step = errors.annotate(parseThing());\n * ```\n */\nexport const declareErrors = <E>() => ({\n annotate: <T>(result: Result<T, unknown>): Result<T, E> => result as Result<T, E>,\n annotateAsync: <T>(result: ResultAsync<T, unknown>): ResultAsync<T, E> =>\n result as ResultAsync<T, E>,\n});\n\n/** Narrow an error by `kind` when using discriminated unions */\nexport const hasKind = <E extends { kind: string }, K extends E[\"kind\"]>(\n error: E,\n kind: K,\n): error is Extract<E, { kind: K }> => error.kind === kind;\n\n/** Map only errors matching `kind`, leave others unchanged */\nexport const mapErrKind =\n <E extends { kind: string }, K extends E[\"kind\"], F>(\n kind: K,\n fn: (error: Extract<E, { kind: K }>) => F,\n ) =>\n <T>(result: Result<T, E>): Result<T, E | F> =>\n isErr(result) && hasKind(result.error, kind)\n ? { _tag: \"Err\", error: fn(result.error) }\n : result;\n\n/** True when no result is Err */\nexport const allOk = <T, E>(results: readonly Result<T, E>[]): boolean => results.every(isOk);\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/internal/proto.ts","../src/result.ts","../src/extra.ts"],"names":[],"mappings":";;;AAMA,IAAM,OAAA,mBAAU,MAAA,CAAO,GAAA,CAAI,4BAA4B,CAAA;AAqDvD,IAAM,OAAA,GAAN,MAAM,QAAA,CAA6C;AAAA,EACxC,IAAA;AAAA,EACA,KAAA;AAAA,EACT,YAAY,KAAA,EAAU;AACpB,IAAA,IAAA,CAAK,IAAA,GAAO,KAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EACA,CAAC,OAAO,CAAA,CAAE,MAAA,EAAgB,SAAkB,OAAA,EAA0B;AACpE,IAAA,OAAO,CAAA,IAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,EAAO,OAAO,CAAC,CAAA,CAAA,CAAA;AAAA,EAC5C;AAAA,EACA,IAAO,GAAA,EAAoC;AACzC,IAAA,OAAO,IAAI,QAAA,CAAc,IAAA,CAAK,KAAK,CAAA;AAAA,EACrC;AAAA,EACA,OAAU,EAAA,EAAmC;AAC3C,IAAA,OAAO,IAAI,QAAA,CAAc,EAAA,CAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,EACzC;AAAA,EACA,QAAc,GAAA,EAAmD;AAC/D,IAAA,OAAO,IAAI,QAAA,CAAkB,IAAA,CAAK,KAAK,CAAA;AAAA,EACzC;AAAA,EACA,QAAc,GAAA,EAAmD;AAC/D,IAAA,OAAO,IAAI,QAAA,CAAkB,IAAA,CAAK,KAAK,CAAA;AAAA,EACzC;AAAA,EACA,QAAW,EAAA,EAA8C;AACvD,IAAA,OAAO,EAAA,CAAG,KAAK,KAAK,CAAA;AAAA,EACtB;AAAA,EACA,IAAI,GAAA,EAAuC;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EACA,OAAO,EAAA,EAAsC;AAC3C,IAAA,EAAA,CAAG,KAAK,KAAK,CAAA;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EACA,KAAA,CAAS,OAAwB,KAAA,EAA2B;AAC1D,IAAA,OAAO,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,EACzB;AAAA,EACA,SAAY,YAAA,EAAwB;AAClC,IAAA,OAAO,YAAA;AAAA,EACT;AACF,CAAA;AAGO,IAAM,MAAA,GAAS,CAAO,KAAA,KAA2B,IAAI,QAAc,KAAK,CAAA;;;AClBxE,IAAM,IAAA,GAAO,CAAO,MAAA,KAA6C,MAAA,CAAO,IAAA,KAAS,IAAA;AAYjF,IAAM,KAAA,GAAQ,CAAO,MAAA,KAA8C,MAAA,CAAO,IAAA,KAAS,KAAA;;;AC7DnF,IAAM,gBAAgB,OAAU;AAAA,EACrC,QAAA,EAAU,CAAI,MAAA,KAA6C,MAAA;AAAA,EAC3D,aAAA,EAAe,CAAI,MAAA,KACjB;AACJ,CAAA;AAGO,IAAM,OAAA,GAAU,CACrB,KAAA,EACA,IAAA,KACqC,MAAM,IAAA,KAAS;AAG/C,IAAM,aACX,CACE,IAAA,EACA,OAEF,CAAI,MAAA,KACF,MAAM,MAAM,CAAA,IAAK,QAAQ,MAAA,CAAO,KAAA,EAAO,IAAI,CAAA,GAAI,MAAA,CAAM,GAAG,MAAA,CAAO,KAAK,CAAC,CAAA,GAAI;AAGtE,IAAM,KAAA,GAAQ,CAAO,OAAA,KAA8C,OAAA,CAAQ,MAAM,IAAI","file":"extra.cjs","sourcesContent":["import type { Result, ResultMethods } from \"../types.js\";\n\n/**\n * `util.inspect` / `Bun.inspect` / `console.log` hook: render `Ok(1)` instead of dumping the class\n * name and every prototype method. Symbol-keyed, so it adds no enumerable field and JSON is unchanged.\n */\nconst INSPECT = Symbol.for(\"nodejs.util.inspect.custom\");\ntype Inspect = (value: unknown, options?: unknown) => string;\n\n/**\n * Live carrier classes. `_tag` and `value` / `error` are own enumerable\n * fields, so JSON and `structuredClone` see plain data; every method lives on\n * the prototype and is therefore non-enumerable.\n *\n * Internal only: reach carriers through {@link newOk} / {@link newErr}\n * (aliased as `mkOk` / `mkErr` for unlocked internals) or the public\n * `ok` / `err`.\n */\nclass OkImpl<T, E> implements ResultMethods<T, E> {\n readonly _tag: \"Ok\";\n readonly value: T;\n // explicit assignment order keeps `_tag` first, so JSON key order matches the plain-data shape\n constructor(value: T) {\n this._tag = \"Ok\";\n this.value = value;\n }\n [INSPECT](_depth: number, options: unknown, inspect: Inspect): string {\n return `Ok(${inspect(this.value, options)})`;\n }\n map<U>(fn: (value: T) => U): Result<U, E> {\n return new OkImpl<U, E>(fn(this.value));\n }\n mapErr<F>(_fn: (error: E) => F): Result<T, F> {\n return new OkImpl<T, F>(this.value);\n }\n flatMap<U, F>(fn: (value: T) => Result<U, F>): Result<U, E | F> {\n return fn(this.value);\n }\n andThen<U, F>(fn: (value: T) => Result<U, F>): Result<U, E | F> {\n return fn(this.value);\n }\n recover<F>(_fn: (error: E) => Result<T, F>): Result<T, F> {\n return new OkImpl<T, F>(this.value);\n }\n tap(fn: (value: T) => void): Result<T, E> {\n fn(this.value);\n return this;\n }\n tapErr(_fn: (error: E) => void): Result<T, E> {\n return this;\n }\n match<U>(onOk: (value: T) => U, _onErr: (error: E) => U): U {\n return onOk(this.value);\n }\n unwrapOr<U>(_defaultValue: U): T | U {\n return this.value;\n }\n}\n\nclass ErrImpl<T, E> implements ResultMethods<T, E> {\n readonly _tag: \"Err\";\n readonly error: E;\n constructor(error: E) {\n this._tag = \"Err\";\n this.error = error;\n }\n [INSPECT](_depth: number, options: unknown, inspect: Inspect): string {\n return `Err(${inspect(this.error, options)})`;\n }\n map<U>(_fn: (value: T) => U): Result<U, E> {\n return new ErrImpl<U, E>(this.error);\n }\n mapErr<F>(fn: (error: E) => F): Result<T, F> {\n return new ErrImpl<T, F>(fn(this.error));\n }\n flatMap<U, F>(_fn: (value: T) => Result<U, F>): Result<U, E | F> {\n return new ErrImpl<U, E | F>(this.error);\n }\n andThen<U, F>(_fn: (value: T) => Result<U, F>): Result<U, E | F> {\n return new ErrImpl<U, E | F>(this.error);\n }\n recover<F>(fn: (error: E) => Result<T, F>): Result<T, F> {\n return fn(this.error);\n }\n tap(_fn: (value: T) => void): Result<T, E> {\n return this;\n }\n tapErr(fn: (error: E) => void): Result<T, E> {\n fn(this.error);\n return this;\n }\n match<U>(_onOk: (value: T) => U, onErr: (error: E) => U): U {\n return onErr(this.error);\n }\n unwrapOr<U>(defaultValue: U): T | U {\n return defaultValue;\n }\n}\n\nexport const newOk = <T, E>(value: T): Result<T, E> => new OkImpl<T, E>(value);\nexport const newErr = <T, E>(error: E): Result<T, E> => new ErrImpl<T, E>(error);\n","import { mkErr, mkOk } from \"./internal/ctor.js\";\nimport { dual } from \"./internal/dual.js\";\nimport type { Payload } from \"./internal/payload.js\";\nimport { newErr, newOk } from \"./internal/proto.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(v); // generic T passes through\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>`), and an array literal\n * stays a mutable tuple (`ok([1, 2])` satisfies `Result<number[], E>`). A\n * generic `T` always comes back as `T`. Passing both type arguments opts out\n * of locking entirely.\n */\nexport function ok<const T extends Payload[]>(value: T): Result<T, never>;\nexport function ok<const T>(value: T): Result<T, never>;\nexport function ok<T, E>(value: T): Result<T, E>;\nexport function ok<T>(value: T): Result<T, never> {\n // Direct carrier construct — skip the unlocked `mkOk` alias hop on the hot path.\n return newOk(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. Inference locks literals the same way as {@link ok}, and a generic\n * `E` always comes back as `E`.\n */\nexport function err<const E extends Payload[]>(error: E): Result<never, E>;\nexport function err<const E>(error: E): Result<never, E>;\nexport function err<T, E>(error: E): Result<T, E>;\nexport function err<E>(error: E): Result<never, E> {\n // Direct carrier construct — skip the unlocked `mkErr` alias hop on the hot path.\n return newErr(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 * @onrails/result/extra — tagged-error helpers.\n */\n\nimport type { ResultAsync } from \"./async.js\";\nimport { mkErr } from \"./internal/ctor.js\";\nimport type { InferErr, InferOk } from \"./internal/infer.js\";\nimport { isErr, isOk } from \"./result.js\";\nimport type { Result } from \"./types.js\";\n\n/** Extract error type from a {@link Result} — alias of {@link InferErr} */\nexport type ErrOf<R> = InferErr<R>;\n\n/** Extract success type from a {@link Result} — alias of {@link InferOk} */\nexport type OkOf<R> = InferOk<R>;\n\n/** Union of error types from a tuple/readonly array of results */\nexport type UnionErrors<R extends readonly Result<unknown, unknown>[]> = {\n [K in keyof R]: ErrOf<R[K]>;\n}[number];\n\n/** Manual union when TS fails to infer multi-step errors (neverthrow #603) */\nexport type AccumulateErrors<Errors extends readonly unknown[]> = Errors[number];\n\n/**\n * Declare the error union for a pipeline when inference only picks the first step.\n *\n * @example\n * ```ts\n * const errors = declareErrors<ParseError | NetworkError>();\n * const step = errors.annotate(parseThing());\n * ```\n */\nexport const declareErrors = <E>() => ({\n annotate: <T>(result: Result<T, unknown>): Result<T, E> => result as Result<T, E>,\n annotateAsync: <T>(result: ResultAsync<T, unknown>): ResultAsync<T, E> =>\n result as ResultAsync<T, E>,\n});\n\n/** Narrow an error by `kind` when using discriminated unions */\nexport const hasKind = <E extends { kind: string }, K extends E[\"kind\"]>(\n error: E,\n kind: K,\n): error is Extract<E, { kind: K }> => error.kind === kind;\n\n/** Map only errors matching `kind`, leave others unchanged */\nexport const mapErrKind =\n <E extends { kind: string }, K extends E[\"kind\"], F>(\n kind: K,\n fn: (error: Extract<E, { kind: K }>) => F,\n ) =>\n <T>(result: Result<T, E>): Result<T, E | F> =>\n isErr(result) && hasKind(result.error, kind) ? mkErr(fn(result.error)) : result;\n\n/** True when no result is Err */\nexport const allOk = <T, E>(results: readonly Result<T, E>[]): boolean => results.every(isOk);\n"]}
|