{"version":3,"sources":["../src/internal/dual.ts","../src/result.ts","../src/types.ts","../src/async.ts","../src/async-lift.ts","../src/collections.ts","../src/pipe.ts","../src/try-gen.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * @onrails/result internal — owning module for the **dual-form idiom**.\n *\n * Every dual-form transform in this package (`map`, `flatMap`, `match`, …)\n * accepts either shape:\n *\n *   data-first: `map(result, fn)`  — full arity, runs immediately\n *   curried:    `map(fn)(result)`  — arity minus the leading `self`, returns\n *                                    a unary function awaiting the data\n *\n * {@link dual} is the single arity dispatcher those transforms derive from;\n * hand-rolled `args.length` checks are not allowed elsewhere.\n *\n * NOTE: a twin copy of this module lives at `packages/maybe/src/internal/dual.ts`\n * — keep the two in sync when editing.\n *\n * Internal only: not listed in package.json `exports` or tsup entries.\n */\n\n/**\n * Derive a dual-form (data-first / curried) function from a single\n * data-first `body`.\n *\n * When called with `args.length >= arity` the wrapper runs `body(...args)`\n * (data-first). With fewer arguments it returns `(self) => body(self, ...args)`\n * — the curried, data-last-`self` form used with `pipe`/`flow`.\n *\n * The public type is supplied entirely by the caller: annotate the exported\n * const with the exact overload set and let `F` be inferred from it.\n *\n * @example\n * ```ts\n * export const map: {\n *   <T, U, E>(result: Result<T, E>, fn: (value: T) => U): Result<U, E>;\n *   <T, U>(fn: (value: T) => U): <E>(result: Result<T, E>) => Result<U, E>;\n * } = dual(\n *   2,\n *   <T, U, E>(result: Result<T, E>, fn: (value: T) => U): Result<U, E> =>\n *     isOk(result) ? ok(fn(result.value)) : err(result.error),\n * );\n * ```\n */\nexport const dual = <F>(arity: number, body: (...args: never[]) => unknown): F => {\n  // `(...args: never[]) => unknown` is the top function type, so every typed\n  // body is assignable to the parameter — but it cannot be invoked with\n  // `unknown` arguments. Re-view it through the variadic shape the dispatcher\n  // actually forwards; the constraint is that `body` only ever receives the\n  // arguments the caller's overload annotation admitted.\n  const run = body as (...args: readonly unknown[]) => unknown;\n  const dispatcher = (...args: readonly unknown[]): unknown =>\n    args.length >= arity ? run(...args) : (self: unknown) => run(self, ...args);\n  // The caller's overload annotation on the exported const supplies the real\n  // public type; internally the dispatcher stays `unknown`-typed.\n  return dispatcher as F;\n};\n","import { dual } from \"./internal/dual.js\";\nimport type { Err, Ok, Result } from \"./types.js\";\n\nexport type { Err, Ok, Result } from \"./types.js\";\n\n/**\n * Lifts a value into the success track.\n *\n * @example\n * ```ts\n * const r = ok(42);                          // Result<number, never>\n * const typed: Result<number, \"parse\"> = ok(1);\n * ```\n */\nexport const ok = <T, E = never>(value: T): Result<T, E> => ({\n  _tag: \"Ok\",\n  value,\n});\n\n/**\n * Fantasy Land `pure` — alias of {@link ok}. One lift name shared across the\n * trio (`of` / `Maybe.of` / `ResultAsync.of`) for generic and FL-style code.\n *\n * @example\n * ```ts\n * const r = of(42);   // Result<number, never> — identical to ok(42)\n * ```\n */\nexport const of = ok;\n\n/**\n * Lifts a value into the error track.\n *\n * @example\n * ```ts\n * const r = err({ kind: \"parse\", message: \"bad json\" });\n * // Result<never, { kind: \"parse\"; message: string }>\n * ```\n */\nexport const err = <T = never, E = unknown>(error: E): Result<T, E> => ({\n  _tag: \"Err\",\n  error,\n});\n\n/**\n * Type-narrowing predicate: returns `true` when the result is `Ok`.\n *\n * @example\n * ```ts\n * if (isOk(r)) {\n *   console.log(r.value);    // narrowed to Ok branch\n * }\n * ```\n */\nexport const isOk = <T, E>(result: Result<T, E>): result is Ok<T, E> => result._tag === \"Ok\";\n\n/**\n * Type-narrowing predicate: returns `true` when the result is `Err`.\n *\n * @example\n * ```ts\n * if (isErr(r)) {\n *   metrics.inc(\"error\", { kind: r.error.kind });\n * }\n * ```\n */\nexport const isErr = <T, E>(result: Result<T, E>): result is Err<T, E> => result._tag === \"Err\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Dual-form helpers — each export accepts either shape:\n//   data-first: `map(result, fn)`\n//   curried:    `map(fn)(result)`\n// Arity dispatch is derived from the internal `dual` combinator\n// (src/internal/dual.ts); the const annotation carries the public overloads.\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Transform the `Ok` value, passing `Err` through unchanged. Dual-form:\n * call data-first or curried (for use with {@link pipe}).\n *\n * @example\n * ```ts\n * map(ok(2), (n) => n * 3);          // Ok 6 — data-first\n * pipe(ok(\"x\"), map((s) => s.length));// Ok 1 — curried\n * ```\n */\nexport const map: {\n  <T, U, E>(result: Result<T, E>, fn: (value: T) => U): Result<U, E>;\n  <T, U>(fn: (value: T) => U): <E>(result: Result<T, E>) => Result<U, E>;\n} = dual(\n  2,\n  <T, U, E>(result: Result<T, E>, fn: (value: T) => U): Result<U, E> =>\n    isOk(result) ? ok(fn(result.value)) : err(result.error),\n);\n\n/**\n * Transform the `Err` value, passing `Ok` through unchanged. Useful for\n * unifying heterogeneous failure types into one app-level union.\n *\n * @example\n * ```ts\n * type AppError = { kind: \"http\"; status: number } | { kind: \"parse\" };\n * pipe(\n *   fetchSync(url),                                     // Result<Body, { status: number }>\n *   mapErr((e): AppError => ({ kind: \"http\", status: e.status })),\n * );\n * ```\n */\nexport const mapErr: {\n  <T, E, F>(result: Result<T, E>, fn: (error: E) => F): Result<T, F>;\n  <E, F>(fn: (error: E) => F): <T>(result: Result<T, E>) => Result<T, F>;\n} = dual(\n  2,\n  <T, E, F>(result: Result<T, E>, fn: (error: E) => F): Result<T, F> =>\n    isErr(result) ? err(fn(result.error)) : ok(result.value),\n);\n\n/**\n * Transform both tracks at once — `Ok` via `onOk`, `Err` via `onErr`.\n * Equivalent to `mapErr(onErr)(map(onOk)(result))` but in one pass.\n *\n * @example\n * ```ts\n * bimap(parsed, (cfg) => cfg.name, (e) => ({ kind: \"input\", cause: e }));\n * ```\n */\nexport const bimap: {\n  <T, U, E, F>(result: Result<T, E>, onOk: (value: T) => U, onErr: (error: E) => F): Result<U, F>;\n  <T, U, E, F>(\n    onOk: (value: T) => U,\n    onErr: (error: E) => F,\n  ): (result: Result<T, E>) => Result<U, F>;\n} = dual(\n  3,\n  <T, U, E, F>(\n    result: Result<T, E>,\n    onOk: (value: T) => U,\n    onErr: (error: E) => F,\n  ): Result<U, F> => (isOk(result) ? ok(onOk(result.value)) : err(onErr(result.error))),\n);\n\n/**\n * Canonical bind (Fantasy Land `chain`). Chains a Result-returning step,\n * widening the error union to `E | F`. Short-circuits on `Err`.\n *\n * @example\n * ```ts\n * flatMap(parseInput(raw), (data) =>\n *   data.id != null ? ok(data) : err({ kind: \"missing_id\" as const }),\n * );\n * // Result<Data, ParseError | { kind: \"missing_id\" }>\n * ```\n */\nexport const flatMap: {\n  <T, U, E, F>(result: Result<T, E>, fn: (value: T) => Result<U, F>): Result<U, E | F>;\n  <T, U, F>(fn: (value: T) => Result<U, F>): <E>(result: Result<T, E>) => Result<U, E | F>;\n} = dual(\n  2,\n  <T, U, E, F>(result: Result<T, E>, fn: (value: T) => Result<U, F>): Result<U, E | F> =>\n    isOk(result) ? fn(result.value) : err(result.error),\n);\n\n/**\n * Error-track bind — runs `fn` only when the result is `Err`, allowing\n * a failed workflow to recover to `Ok` or remap the failure. Mirror of\n * {@link flatMap} on the error channel.\n *\n * @example\n * ```ts\n * recover(networkResult, (e) =>\n *   e.kind === \"rate_limit\" ? ok(cachedBody) : err(e),\n * );\n * ```\n */\nexport const recover: {\n  <T, E, F>(result: Result<T, E>, fn: (error: E) => Result<T, F>): Result<T, F>;\n  <T, E, F>(fn: (error: E) => Result<T, F>): (result: Result<T, E>) => Result<T, F>;\n} = dual(\n  2,\n  <T, E, F>(result: Result<T, E>, fn: (error: E) => Result<T, F>): Result<T, F> =>\n    isErr(result) ? fn(result.error) : ok(result.value),\n);\n\n/**\n * Observe the `Ok` value for side effects (logging, metrics) without\n * changing the carried value. Passes `Err` through untouched.\n *\n * @example\n * ```ts\n * pipe(\n *   parseConfig(raw),\n *   tap((cfg) => log.info({ msg: \"parsed\", name: cfg.name })),\n *   flatMap(validate),\n * );\n * ```\n */\nexport const tap: {\n  <T, E>(result: Result<T, E>, fn: (value: T) => void): Result<T, E>;\n  <T>(fn: (value: T) => void): <E>(result: Result<T, E>) => Result<T, E>;\n} = dual(2, <T, E>(result: Result<T, E>, fn: (value: T) => void): Result<T, E> => {\n  if (isOk(result)) fn(result.value);\n  return result;\n});\n\n/**\n * Observe the `Err` value for side effects (logging, metrics) without\n * changing the carried error. Passes `Ok` through untouched.\n *\n * @example\n * ```ts\n * pipe(\n *   loadUser(id),\n *   tapErr((e) => metrics.inc(\"user.load.fail\", { kind: e.kind })),\n * );\n * ```\n */\nexport const tapErr: {\n  <T, E>(result: Result<T, E>, fn: (error: E) => void): Result<T, E>;\n  <E>(fn: (error: E) => void): <T>(result: Result<T, E>) => Result<T, E>;\n} = dual(2, <T, E>(result: Result<T, E>, fn: (error: E) => void): Result<T, E> => {\n  if (isErr(result)) fn(result.error);\n  return result;\n});\n\n/**\n * Terminal collapse — fold both tracks into a single value. Dual-form:\n * 3-args data-first, 2-args curried for {@link pipe}. Returns whatever\n * the handlers return.\n *\n * For files that also import `match` from `ts-pattern`, use a namespace\n * import (`import * as R from \"@onrails/result\"` → `R.match`) to dissolve\n * the collision.\n *\n * @example\n * ```ts\n * const html = match(parsed, (cfg) => render(cfg), (e) => renderError(e));\n * ```\n */\nexport const match: {\n  <T, E, U>(result: Result<T, E>, onOk: (value: T) => U, onErr: (error: E) => U): U;\n  <T, E, U>(onOk: (value: T) => U, onErr: (error: E) => U): (result: Result<T, E>) => U;\n} = dual(\n  3,\n  <T, E, U>(result: Result<T, E>, onOk: (value: T) => U, onErr: (error: E) => U): U =>\n    isOk(result) ? onOk(result.value) : onErr(result.error),\n);\n\n/**\n * Returns the `Ok` value, or `defaultValue` when the result is `Err`.\n *\n * @example\n * ```ts\n * unwrapOr(parsedSetting, \"default-value\");\n * ```\n */\nexport const unwrapOr: {\n  <T, E>(result: Result<T, E>, defaultValue: T): T;\n  <T>(defaultValue: T): <E>(result: Result<T, E>) => T;\n} = dual(\n  2,\n  <T, E>(result: Result<T, E>, defaultValue: T): T => (isOk(result) ? result.value : defaultValue),\n);\n\n/**\n * Test/assert helper — returns the `Ok` value, or **throws the original `Err`\n * value** when called on an `Err`. This is the assertion tier (RFC 0001 §4):\n * intended for `*.spec.ts` / `*.test.ts`, where throwing fails the test loudly.\n * In business logic prefer {@link match} or {@link unwrapOr}; the lint plugins\n * flag `unwrapOk` outside test files.\n *\n * @returns the unwrapped `Ok` value\n * @throws the carried `Err` value when the result is `Err`\n *\n * @example\n * ```ts\n * // in a *.spec.ts\n * expect(unwrapOk(ok(5))).toBe(5);\n * expect(() => unwrapOk(err(error))).toThrow(error);\n * ```\n */\nexport function unwrapOk<T, E>(result: Result<T, E>): T {\n  if (isErr(result)) throw result.error;\n  return result.value;\n}\n\n/** Alias of {@link unwrapOk} for syntax cohesion with `@onrails/maybe`. */\nexport const unwrap = unwrapOk;\n\n/**\n * Test/assert helper — returns the `Err` value, or **throws a `TypeError`**\n * when called on an `Ok`. Mirror of {@link unwrapOk} on the error track and\n * part of the same assertion tier (RFC 0001 §4): intended for `*.spec.ts` /\n * `*.test.ts`. Prefer {@link match} / {@link unwrapOr} in business logic; the\n * lint plugins flag `unwrapErr` outside test files.\n *\n * @returns the unwrapped `Err` value\n * @throws `TypeError` when the result is `Ok`\n *\n * @example\n * ```ts\n * // in a *.spec.ts\n * expect(unwrapErr(err(\"x\"))).toBe(\"x\");\n * expect(() => unwrapErr(ok(5))).toThrow(TypeError);\n * ```\n */\nexport function unwrapErr<T, E>(result: Result<T, E>): E {\n  if (isOk(result)) throw new TypeError(\"unwrapErr called on Ok\");\n  return result.error;\n}\n\n/**\n * Wraps a throwing sync function, returning a function that produces a\n * {@link Result} instead of throwing. Thrown errors pass through `onThrow` to\n * become a typed `Err`; a normal return becomes `Ok`. The neverthrow analogue\n * is `Result.fromThrowable`.\n *\n * @param fn - the throwing function to wrap\n * @param onThrow - maps a thrown value to the `Err` channel\n * @returns a function with `fn`'s parameters that returns `Result<ReturnType, E>`\n *\n * @example\n * ```ts\n * type ParseError = { kind: \"parse\"; message: string };\n * const parse = trySync(\n *   JSON.parse,\n *   (e): ParseError => ({ kind: \"parse\", message: String(e) }),\n * );\n * parse(\"{}\");      // Ok({})\n * parse(\"nope\");    // Err({ kind: \"parse\", … })\n * ```\n */\nexport function trySync<A extends readonly unknown[], T, E>(\n  fn: (...args: A) => T,\n  onThrow: (error: unknown) => E,\n): (...args: A) => Result<T, E>;\nexport function trySync<F extends (...args: never) => unknown, E>(\n  fn: F,\n  onThrow: (error: unknown) => E,\n): (...args: Parameters<F>) => Result<ReturnType<F>, E>;\nexport function trySync(\n  fn: (...args: never) => unknown,\n  onThrow: (error: unknown) => unknown,\n): (...args: never) => Result<unknown, unknown> {\n  return (...args: never) => {\n    try {\n      return ok(fn(...args));\n    } catch (error) {\n      return err(onThrow(error));\n    }\n  };\n}\n\n/**\n * Variadic value-first pipe — threads `value` through up to nine unary fns,\n * left-to-right. Use {@link pipe} when you already have a starting value;\n * use {@link flow} to define a reusable composed function with no value yet.\n *\n * @example\n * ```ts\n * pipe(\n *   parseConfig(raw),\n *   map((cfg) => cfg.name),\n *   flatMap((name) => (name ? ok(name) : err({ kind: \"empty\" as const }))),\n *   tap(log),\n * );\n * ```\n */\nexport function pipe<A>(value: A): A;\nexport function pipe<A, B>(value: A, ab: (a: A) => B): B;\nexport function pipe<A, B, C>(value: A, ab: (a: A) => B, bc: (b: B) => C): C;\nexport function pipe<A, B, C, D>(value: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D): D;\nexport function pipe<A, B, C, D, E>(\n  value: A,\n  ab: (a: A) => B,\n  bc: (b: B) => C,\n  cd: (c: C) => D,\n  de: (d: D) => E,\n): E;\nexport function pipe<A, B, C, D, E, F>(\n  value: A,\n  ab: (a: A) => B,\n  bc: (b: B) => C,\n  cd: (c: C) => D,\n  de: (d: D) => E,\n  ef: (e: E) => F,\n): F;\nexport function pipe<A, B, C, D, E, F, G>(\n  value: A,\n  ab: (a: A) => B,\n  bc: (b: B) => C,\n  cd: (c: C) => D,\n  de: (d: D) => E,\n  ef: (e: E) => F,\n  fg: (f: F) => G,\n): G;\nexport function pipe<A, B, C, D, E, F, G, H>(\n  value: A,\n  ab: (a: A) => B,\n  bc: (b: B) => C,\n  cd: (c: C) => D,\n  de: (d: D) => E,\n  ef: (e: E) => F,\n  fg: (f: F) => G,\n  gh: (g: G) => H,\n): H;\nexport function pipe<A, B, C, D, E, F, G, H, I>(\n  value: A,\n  ab: (a: A) => B,\n  bc: (b: B) => C,\n  cd: (c: C) => D,\n  de: (d: D) => E,\n  ef: (e: E) => F,\n  fg: (f: F) => G,\n  gh: (g: G) => H,\n  hi: (h: H) => I,\n): I;\nexport function pipe(value: unknown, ...fns: ReadonlyArray<(x: unknown) => unknown>): unknown {\n  let acc = value;\n  for (const fn of fns) {\n    acc = fn(acc);\n  }\n  return acc;\n}\n\nconst printPayload = (payload: unknown): string => {\n  try {\n    return JSON.stringify(payload) ?? String(payload);\n  } catch {\n    // cyclic or non-JSON payload — a debug printer must not throw\n    return String(payload);\n  }\n};\n\n/**\n * Debug printer — renders a result as `Ok(…)` / `Err(…)` for logs. Payloads\n * print as JSON (values are plain data by design); non-JSON payloads fall\n * back to `String(...)`.\n *\n * @example\n * ```ts\n * show(ok(1));               // 'Ok(1)'\n * show(err({ kind: \"e\" })); // 'Err({\"kind\":\"e\"})'\n * ```\n */\nexport const show = <T, E>(result: Result<T, E>): string =>\n  isOk(result) ? `Ok(${printPayload(result.value)})` : `Err(${printPayload(result.error)})`;\n","/**\n * The core railway type: a tagged union carrying either a success value\n * (`Ok<T>`) or a failure value (`Err<E>`). It is a plain discriminated union\n * on `_tag` — no classes — so it is immutable and tree-shake friendly. Narrow\n * with {@link isOk} / {@link isErr} to read `.value` / `.error`.\n *\n * @typeParam T - the `Ok` value type\n * @typeParam E - the `Err` error type\n *\n * @example\n * ```ts\n * function parse(raw: string): Result<number, \"nan\"> {\n *   const n = Number(raw);\n *   return Number.isNaN(n) ? err(\"nan\") : ok(n);\n * }\n * ```\n */\nexport type Result<T, E> =\n  | { readonly _tag: \"Ok\"; readonly value: T }\n  | { readonly _tag: \"Err\"; readonly error: E };\n\n/**\n * The success branch of a {@link Result} — `{ _tag: \"Ok\"; value: T }`.\n * The `E` parameter keeps the type assignable to `Result<T, E>`.\n */\nexport type Ok<T, E = never> = Extract<Result<T, E>, { _tag: \"Ok\" }>;\n\n/**\n * The failure branch of a {@link Result} — `{ _tag: \"Err\"; error: E }`.\n */\nexport type Err<T, E> = Extract<Result<T, E>, { _tag: \"Err\" }>;\n\n/**\n * Error subclass representing an **unexpected** defect — a thrown exception or\n * promise rejection that was not part of the modelled `Err` union. Used as the\n * default mapping when {@link fromAsync} is called without an `onDefect`\n * handler; the original cause is preserved on `.cause`.\n *\n * @example\n * ```ts\n * const defect = new UnexpectedError(\"Unexpected async defect\", caught);\n * defect.cause; // the original thrown value\n * ```\n */\nexport class UnexpectedError extends Error {\n  constructor(\n    message: string,\n    override readonly cause?: unknown,\n  ) {\n    super(message);\n    this.name = \"UnexpectedError\";\n  }\n}\n","import type { InferErr, InferOk } from \"./internal/infer.js\";\nimport { err, isErr, map, mapErr, ok } from \"./result.js\";\nimport type { Result } from \"./types.js\";\nimport { UnexpectedError } from \"./types.js\";\n\ntype PromiseFactory<T, E> = () => Promise<Result<T, E>>;\ntype CombineTupleAsync<R extends readonly ResultAsync<unknown, unknown>[]> = ResultAsync<\n  { [K in keyof R]: InferOk<R[K]> },\n  { [K in keyof R]: InferErr<R[K]> }[number]\n>;\n\n/** Collapses settled results left-to-right, short-circuiting on the first `Err`. */\nconst sequenceSettled = (\n  settled: readonly Result<unknown, unknown>[],\n): Result<unknown[], unknown> => {\n  const values: unknown[] = [];\n  for (const result of settled) {\n    if (isErr(result)) {\n      return err(result.error);\n    }\n    values.push(result.value);\n  }\n  return ok(values);\n};\n\n/**\n * Async railway carrier. Wraps a deferred `Promise<Result<T, E>>` and exposes\n * the same dual-track transforms as the sync {@link Result} — `map`, `flatMap`,\n * `recover`, `tap`, `match`. The public API never surfaces `Promise<Result<…>>`\n * directly: `await` the instance (it is thenable) or call {@link resolve} /\n * {@link match} to settle it.\n *\n * Construct via the static factories ({@link ok}, {@link err}, {@link fromPromise},\n * {@link defer}, …) rather than `new` — the constructor is `protected`.\n *\n * @typeParam T - the `Ok` value type\n * @typeParam E - the `Err` error type\n *\n * @example\n * ```ts\n * const user = ResultAsync.fromPromise(api.getUser(id), toAppError)\n *   .map((u) => u.profile)\n *   .recover(() => ResultAsync.ok(guestProfile));\n *\n * const r = await user;          // Result<Profile, AppError>\n * ```\n */\nexport class ResultAsync<T, E> {\n  private promise: Promise<Result<T, E>> | null = null;\n\n  protected constructor(protected readonly run: PromiseFactory<T, E>) {}\n\n  /**\n   * Lifts an already-settled sync {@link Result} into a {@link ResultAsync}.\n   *\n   * @example\n   * ```ts\n   * const ra = ResultAsync.fromResult(ok(42));   // ResultAsync<number, never>\n   * ```\n   */\n  static fromResult<T, E>(result: Result<T, E>): ResultAsync<T, E> {\n    return new ResultAsync(async () => result);\n  }\n\n  /**\n   * Wraps a `PromiseLike<T>` that may reject. Rejections pass through `onReject`\n   * to become a typed `Err`; resolution becomes `Ok<T>`.\n   *\n   * @param promise - the promise to wrap\n   * @param onReject - maps a rejection reason to the `Err` channel\n   *\n   * @example\n   * ```ts\n   * const body = ResultAsync.fromPromise(\n   *   fetch(url).then((r) => r.text()),\n   *   (e): NetError => ({ kind: \"net\", cause: String(e) }),\n   * );\n   * ```\n   */\n  static fromPromise<T, E>(\n    promise: PromiseLike<T>,\n    onReject: (error: unknown) => E,\n  ): ResultAsync<T, E> {\n    return new ResultAsync(async () => {\n      try {\n        return ok(await promise);\n      } catch (error) {\n        return err(onReject(error));\n      }\n    });\n  }\n\n  /**\n   * Wraps a `PromiseLike<T>` that is **guaranteed not to reject**, skipping the\n   * `onReject` mapper. Use only when rejection is provably impossible.\n   *\n   * @example\n   * ```ts\n   * const now = ResultAsync.fromSafePromise(Promise.resolve(Date.now()));\n   * ```\n   */\n  static fromSafePromise<T, E = never>(promise: PromiseLike<T>): ResultAsync<T, E> {\n    return new ResultAsync(async () => ok(await promise));\n  }\n\n  /**\n   * Defers work until {@link resolve}. Unlike {@link fromPromise}, the factory\n   * does not run until the `ResultAsync` is resolved (e.g. by `combineTuple` /\n   * `combineTupleParallel`). The factory runs at most once — `resolve` memoizes.\n   *\n   * @example\n   * ```ts\n   * const insert = ResultAsync.defer(() => db.orders.insert(row));\n   * // nothing has run yet\n   * const r = await insert;   // factory runs exactly once here\n   * ```\n   */\n  static defer<T, E>(fn: () => Promise<Result<T, E>>): ResultAsync<T, E> {\n    return new ResultAsync(fn);\n  }\n\n  /**\n   * Lifts a value into an `Ok` async result.\n   *\n   * @example\n   * ```ts\n   * const r = ResultAsync.ok(42);   // ResultAsync<number, never>\n   * ```\n   */\n  static ok<T>(value: T): ResultAsync<T, never>;\n  static ok<T, E>(value: T): ResultAsync<T, E>;\n  static ok<T, E = never>(value: T): ResultAsync<T, E> {\n    return new ResultAsync(async () => ok(value));\n  }\n\n  /**\n   * Fantasy Land `pure` — alias of {@link ResultAsync.ok}. One lift name\n   * shared across the trio (`of` / `Maybe.of` / `ResultAsync.of`).\n   */\n  static of<T>(value: T): ResultAsync<T, never>;\n  static of<T, E>(value: T): ResultAsync<T, E>;\n  static of<T, E = never>(value: T): ResultAsync<T, E> {\n    return ResultAsync.ok(value);\n  }\n\n  /**\n   * Lifts an error into an `Err` async result.\n   *\n   * @example\n   * ```ts\n   * const r = ResultAsync.err({ kind: \"not_found\" as const });\n   * ```\n   */\n  static err<T = never, E = unknown>(error: E): ResultAsync<T, E> {\n    return new ResultAsync(async () => err(error));\n  }\n\n  /**\n   * Lifts an existing `Promise<Result<T, E>>` (e.g. from interop code) into a\n   * {@link ResultAsync}. A thrown defect is routed through `onDefect`,\n   * defaulting to {@link UnexpectedError}. The `Ok` value passes through\n   * verbatim — even when it happens to be Result-shaped.\n   *\n   * @param promise - a promise that already yields a `Result`\n   * @param onDefect - maps an unexpected throw to the `Err` channel\n   * @see {@link fromAsync} from `@onrails/result`\n   */\n  static fromResultPromise<T, E>(\n    promise: Promise<Result<T, E>>,\n    onDefect?: (error: unknown) => E | UnexpectedError,\n  ): ResultAsync<T, E | UnexpectedError> {\n    const mapDefect =\n      onDefect ?? ((error: unknown) => new UnexpectedError(\"Unexpected async defect\", error));\n    return new ResultAsync<T, E | UnexpectedError>(async () => {\n      try {\n        return await promise;\n      } catch (error) {\n        return err(mapDefect(error));\n      }\n    });\n  }\n\n  /**\n   * Combines a homogeneous array of async results into one. Resolves\n   * **sequentially** in input order, short-circuiting on the first `Err`.\n   * For heterogeneous tuples that preserve per-index types, use\n   * {@link combineTuple}; for wall-clock overlap, {@link combineTupleParallel}.\n   *\n   * @example\n   * ```ts\n   * const all = ResultAsync.combine([loadA(), loadB(), loadC()]);\n   * // ResultAsync<Item[], LoadError>\n   * ```\n   */\n  static combine<T, E>(results: readonly ResultAsync<T, E>[]): ResultAsync<T[], E> {\n    return new ResultAsync(async () => {\n      const values: T[] = [];\n      for (const ra of results) {\n        const result = await ra.resolve();\n        if (isErr(result)) {\n          return err(result.error);\n        }\n        values.push(result.value);\n      }\n      return ok(values);\n    });\n  }\n\n  /**\n   * Heterogeneous async tuple combine — resolves branches **sequentially**\n   * (left-to-right), returning the first `Err` in input order. Preserves each\n   * branch's `Ok` type by position, so the result destructures type-safely.\n   * This is the canonical sequential async combine (replaces the former\n   * `sequenceTupleAsync`).\n   *\n   * @example\n   * ```ts\n   * const combined = ResultAsync.combineTuple([loadCfg(), loadCatalog()] as const);\n   * // ResultAsync<readonly [Cfg, Catalog], CfgError | CatalogError>\n   * const r = await combined;\n   * if (isOk(r)) {\n   *   const [cfg, catalog] = r.value;  // typed per position\n   * }\n   * ```\n   */\n  static combineTuple<const R extends readonly ResultAsync<unknown, unknown>[]>(\n    results: R,\n  ): CombineTupleAsync<R> {\n    // Runtime identical to combine; the cast restores per-index tuple types.\n    return ResultAsync.combine(\n      results as readonly ResultAsync<unknown, unknown>[],\n    ) as CombineTupleAsync<R>;\n  }\n\n  /**\n   * Like {@link combineTuple}, but starts every branch before awaiting (wall-clock\n   * parallel for independent IO). On failure, returns the first `Err` in input order.\n   *\n   * @example\n   * ```ts\n   * // independent IO — overlap them\n   * const combined = ResultAsync.combineTupleParallel([\n   *   loadProfile(id),\n   *   loadMetrics(id),\n   * ] as const);\n   * ```\n   */\n  static combineTupleParallel<const R extends readonly ResultAsync<unknown, unknown>[]>(\n    results: R,\n  ): CombineTupleAsync<R> {\n    // Cast restores per-index tuple types over the untyped sequence core.\n    return new ResultAsync(async () =>\n      sequenceSettled(await Promise.all(results.map((ra) => ra.resolve()))),\n    ) as CombineTupleAsync<R>;\n  }\n\n  /**\n   * Transforms the `Ok` value, passing `Err` through unchanged.\n   *\n   * @example\n   * ```ts\n   * ResultAsync.ok(2).map((n) => n * 3);   // ResultAsync<number> → Ok 6\n   * ```\n   */\n  map<U>(fn: (value: T) => U): ResultAsync<U, E> {\n    return new ResultAsync(async () => map(await this.resolve(), fn));\n  }\n\n  /**\n   * Transforms the `Err` value, passing `Ok` through unchanged — useful for\n   * unifying heterogeneous failures into one app-level union.\n   *\n   * @example\n   * ```ts\n   * load(id).mapErr((e): AppError => ({ kind: \"load\", cause: e })); // ResultAsync<T, AppError>\n   * ```\n   */\n  mapErr<F>(fn: (error: E) => F): ResultAsync<T, F> {\n    return new ResultAsync(async () => mapErr(await this.resolve(), fn));\n  }\n\n  /**\n   * Canonical bind — chains a step that itself returns a `ResultAsync` or sync\n   * `Result`, short-circuiting on `Err`. Error types accumulate (`E | F`).\n   *\n   * @example\n   * ```ts\n   * authenticate(req)\n   *   .flatMap((user) => loadProfile(user.id))   // ResultAsync\n   *   .flatMap((p) => validate(p));              // sync Result also accepted\n   * ```\n   */\n  flatMap<U, F = E>(fn: (value: T) => ResultAsync<U, F> | Result<U, F>): ResultAsync<U, E | F> {\n    return new ResultAsync<U, E | F>(async () => {\n      const first = await this.resolve();\n      if (isErr(first)) {\n        return first;\n      }\n      const next = fn(first.value);\n      return next instanceof ResultAsync ? next.resolve() : next;\n    });\n  }\n\n  /**\n   * neverthrow-compat alias of {@link flatMap}. Kept as the documented compat\n   * tier; prefer {@link flatMap} in new code.\n   *\n   * @example\n   * ```ts\n   * authenticate(req).andThen((user) => loadProfile(user.id));\n   * ```\n   */\n  andThen<U, F = E>(fn: (value: T) => ResultAsync<U, F> | Result<U, F>): ResultAsync<U, E | F> {\n    return this.flatMap(fn);\n  }\n\n  /**\n   * Error-channel bind — runs `fn` only on `Err`, swapping in a recovery\n   * `ResultAsync` or sync `Result`. `Ok` passes through. The mirror of\n   * {@link flatMap} on the error track.\n   *\n   * @example\n   * ```ts\n   * loadFromCache(id).recover(() => loadFromOrigin(id)); // ResultAsync<T, F>\n   * ```\n   */\n  recover<F>(fn: (error: E) => ResultAsync<T, F> | Result<T, F>): ResultAsync<T, F> {\n    return new ResultAsync<T, F>(async () => {\n      const first = await this.resolve();\n      if (!isErr(first)) {\n        return first;\n      }\n      const next = fn(first.error);\n      return next instanceof ResultAsync ? next.resolve() : next;\n    });\n  }\n\n  /**\n   * neverthrow-compat alias of {@link recover}. Kept as the documented compat\n   * tier; prefer {@link recover} in new code.\n   *\n   * @example\n   * ```ts\n   * loadFromCache(id).orElse(() => loadFromOrigin(id));\n   * ```\n   */\n  orElse<F>(fn: (error: E) => ResultAsync<T, F> | Result<T, F>): ResultAsync<T, F> {\n    return this.recover(fn);\n  }\n\n  /**\n   * Runs a side effect on the `Ok` value and passes the result through\n   * unchanged; a no-op on `Err`. Mirrors {@link tapErr}.\n   *\n   * @example\n   * ```ts\n   * saveUser(u).tap((saved) => analytics.track(\"user_saved\", saved.id));\n   * ```\n   */\n  tap(fn: (value: T) => void): ResultAsync<T, E> {\n    return new ResultAsync(async () => {\n      const result = await this.resolve();\n      if (!isErr(result)) {\n        fn(result.value);\n      }\n      return result;\n    });\n  }\n\n  /**\n   * Runs a side effect on the `Err` value and passes the result through\n   * unchanged; a no-op on `Ok`. The error-track mirror of {@link tap}.\n   *\n   * @example\n   * ```ts\n   * saveUser(u).tapErr((e) => logger.warn(\"save failed\", e));\n   * ```\n   */\n  tapErr(fn: (error: E) => void): ResultAsync<T, E> {\n    return new ResultAsync(async () => {\n      const result = await this.resolve();\n      if (isErr(result)) {\n        fn(result.error);\n      }\n      return result;\n    });\n  }\n\n  /**\n   * Settles to the `Ok` value, or `defaultValue` if `Err`. Terminal — returns a\n   * plain `Promise`, not a `ResultAsync`.\n   *\n   * @example\n   * ```ts\n   * const profile = await loadProfile(id).unwrapOr(guestProfile);\n   * ```\n   */\n  unwrapOr<U>(defaultValue: U): Promise<T | U> {\n    return this.resolve().then((result) => (isErr(result) ? defaultValue : result.value));\n  }\n\n  /**\n   * Terminal collapse — folds both tracks into a single awaited value. Returns\n   * a plain `Promise`, settling the carrier exactly once.\n   *\n   * @param onOk - handles the `Ok` value\n   * @param onErr - handles the `Err` value\n   *\n   * @example\n   * ```ts\n   * const status = await save(row).match(\n   *   () => 200,\n   *   (e) => (e.kind === \"conflict\" ? 409 : 500),\n   * );\n   * ```\n   */\n  match<U1, U2 = U1>(onOk: (value: T) => U1, onErr: (error: E) => U2): Promise<U1 | U2> {\n    return this.resolve().then((result) =>\n      isErr(result) ? onErr(result.error) : onOk(result.value),\n    );\n  }\n\n  /**\n   * Settles the carrier to a bare sync {@link Result}, memoizing so the\n   * underlying factory runs at most once. Prefer `await ra` (the thenable) or\n   * {@link match} in app code; use `resolve` when you need the tagged union back.\n   *\n   * @example\n   * ```ts\n   * const r = await load(id).resolve();   // Result<Data, LoadError>\n   * if (isOk(r)) use(r.value);\n   * ```\n   */\n  resolve(): Promise<Result<T, E>> {\n    if (!this.promise) {\n      this.promise = this.run();\n    }\n    return this.promise;\n  }\n\n  /**\n   * Thenable shim — `await ra` resolves to a bare tagged-union `Result<T, E>`.\n   * Narrow with `isOk(r)` / `isErr(r)` to read `.value` / `.error`.\n   */\n  // biome-ignore lint/suspicious/noThenProperty: makes ResultAsync awaitable\n  then<R1 = Result<T, E>, R2 = never>(\n    onfulfilled?: ((value: Result<T, E>) => R1 | PromiseLike<R1>) | undefined | null,\n    onrejected?: ((reason: unknown) => R2 | PromiseLike<R2>) | undefined | null,\n  ): Promise<R1 | R2> {\n    return this.resolve().then(\n      // Safe: without onfulfilled, R1 stays at its Result<T, E> default.\n      (r) => (onfulfilled ? onfulfilled(r) : (r as unknown as R1)),\n      onrejected ?? undefined,\n    );\n  }\n}\n\n/**\n * The free-function lift helpers (`okAsync`, `errAsync`, `fromPromise`,\n * `fromSafePromise`, `fromResult`, `fromAsync`, `asyncAfter`, `tryAsync`)\n * live in `./async-lift.ts` and are re-exported from the package index.\n */\n","/**\n * @onrails/result — THE lift module. Every \"value → {@link ResultAsync}\"\n * entry point is defined exactly once, here: `okAsync`, `errAsync`,\n * `fromPromise`, `fromSafePromise`, `fromResult`, `fromAsync`, `asyncAfter`,\n * `tryAsync`.\n */\n\nimport { ResultAsync } from \"./async.js\";\nimport { dual } from \"./internal/dual.js\";\nimport type { InferErr, InferOk } from \"./internal/infer.js\";\nimport type { Result, UnexpectedError } from \"./types.js\";\n\n// The bare renames below detach statics from the class. Safe: every\n// `ResultAsync` static references the class by name (`new ResultAsync`,\n// `ResultAsync.combine`), never `this`.\n\n/**\n * Lifts a value into an `Ok` async result.\n *\n * @example\n * ```ts\n * const r = okAsync(42);                  // ResultAsync<number, never>\n * ```\n */\nexport const okAsync = ResultAsync.ok;\n\n/**\n * Lifts a value into an `Err` async result.\n *\n * @example\n * ```ts\n * const r = errAsync({ kind: \"not_found\" as const });\n * ```\n */\nexport const errAsync = ResultAsync.err;\n\n/**\n * Wraps a `PromiseLike<T>` into a {@link ResultAsync}. Reject reasons go\n * through `onReject` to become typed `Err`s; success becomes `Ok<T>`.\n *\n * @example\n * ```ts\n * const body = fromPromise(\n *   fetch(url).then((r) => r.text()),\n *   (e): NetworkError => ({ kind: \"network\", cause: String(e) }),\n * );\n * ```\n */\nexport const fromPromise = ResultAsync.fromPromise;\n\n/**\n * Wraps a `PromiseLike<T>` that **never rejects** into {@link ResultAsync}.\n * Skips the `onReject` mapper. Use only when the promise is provably safe.\n */\nexport const fromSafePromise = ResultAsync.fromSafePromise;\n\n/**\n * Lifts an already-settled sync {@link Result} into a {@link ResultAsync}, so\n * it can be chained alongside async steps in a railway.\n *\n * @example\n * ```ts\n * const ra = fromResult(ok(1));            // ResultAsync<number, never>\n * await fromResult(err(error)).resolve();  // Err(error)\n * ```\n */\nexport const fromResult = ResultAsync.fromResult;\n\n/**\n * Bind a sync {@link Result} into an async step without widening defects.\n * Dual-form: data-first for one-shots, data-last (curried) for `pipe`/`flow`.\n *\n * @example\n * ```ts\n * asyncAfter(result, (u) => tryAsync(db.insert(u), toErr)); // data-first\n * asyncAfter((u) => tryAsync(db.insert(u), toErr));         // data-last\n * ```\n */\nexport const asyncAfter: {\n  <T, U, E, F>(result: Result<T, E>, fn: (value: T) => ResultAsync<U, F>): ResultAsync<U, E | F>;\n  <T, U, F>(\n    fn: (value: T) => ResultAsync<U, F>,\n  ): <E>(result: Result<T, E>) => ResultAsync<U, E | F>;\n} = dual(\n  2,\n  <T, U, E, F>(result: Result<T, E>, fn: (value: T) => ResultAsync<U, F>): ResultAsync<U, E | F> =>\n    fromResult(result).flatMap(fn),\n);\n\ntype AnyResult = Result<unknown, unknown>;\n\n/**\n * Lifts a `(...args) => Promise<Result<T, E>>` function (typical of interop or\n * boundary code) into one returning `(...args) => ResultAsync<T, E>`. Expected\n * `Err`s pass through; an unexpected promise rejection (a defect) is routed via\n * `onDefect`, defaulting to {@link UnexpectedError} and widening the error union.\n *\n * @param fn - a function returning a promise that already yields a `Result`\n * @param onDefect - maps an unexpected rejection to the `Err` channel\n *\n * @example\n * ```ts\n * const loadUser = fromAsync(\n *   (id: string): Promise<Result<User, NotFound>> => api.getUser(id),\n * );\n * const ra = loadUser(\"u1\");   // ResultAsync<User, NotFound | UnexpectedError>\n * ```\n */\nexport const fromAsync =\n  <A extends readonly unknown[], R extends AnyResult>(\n    fn: (...args: A) => Promise<R>,\n    onDefect?: (error: unknown) => InferErr<R> | UnexpectedError,\n  ): ((...args: A) => ResultAsync<InferOk<R>, InferErr<R> | UnexpectedError>) =>\n  (...args: A) =>\n    ResultAsync.fromResultPromise(fn(...args), onDefect) as ResultAsync<\n      InferOk<R>,\n      InferErr<R> | UnexpectedError\n    >;\n\nconst toError = (error: unknown): Error =>\n  error instanceof Error ? error : new Error(String(error));\n\n/**\n * Convenience wrapper over {@link fromPromise} with default `Error`\n * normalization. Call without `onReject` to get `ResultAsync<T, Error>`,\n * or pass a custom mapper for a typed error.\n *\n * @example\n * ```ts\n * // Default: rejection → Err(Error)\n * const a = tryAsync(db.users.insert(row));\n *\n * // Custom: typed error\n * const b = tryAsync(db.users.insert(row), (e): DbError => ({\n *   kind: \"db\",\n *   cause: e,\n * }));\n * ```\n */\nexport function tryAsync<T>(promise: PromiseLike<T>): ResultAsync<T, Error>;\nexport function tryAsync<T, E>(\n  promise: PromiseLike<T>,\n  onReject: (error: unknown) => E,\n): ResultAsync<T, E>;\nexport function tryAsync<T, E>(\n  promise: PromiseLike<T>,\n  onReject?: (error: unknown) => E,\n): ResultAsync<T, E | Error> {\n  return onReject\n    ? ResultAsync.fromPromise(promise, onReject)\n    : ResultAsync.fromPromise(promise, toError);\n}\n","/**\n * @onrails/result — sync aggregation, one module, two axes:\n *\n *   short-circuit (first `Err` wins)      — {@link combine} / {@link combineTuple}\n *   accumulate expected failures          — {@link validateAll} / {@link validateTuple}\n *\n * The accumulate pair collects every failure into a readonly array by\n * default, or folds them with an explicit `combineErrors` when given one.\n */\n\nimport type { InferErr, InferOk } from \"./internal/infer.js\";\nimport { err, isErr, ok } from \"./result.js\";\nimport type { Result } from \"./types.js\";\n\n/**\n * Combines a homogeneous array of results into a single result holding an\n * array of the `Ok` values, in input order. Short-circuits on the first `Err`\n * (first failure wins). For heterogeneous tuples that preserve per-index\n * types, use {@link combineTuple}.\n *\n * @example\n * ```ts\n * combine([ok(1), ok(2)]);        // Ok([1, 2])\n * combine([ok(1), err(\"e\")]);     // Err(\"e\")\n * ```\n */\nexport const combine = <T, E>(results: readonly Result<T, E>[]): Result<T[], E> => {\n  const values: T[] = [];\n  for (const result of results) {\n    if (isErr(result)) return err(result.error);\n    values.push(result.value);\n  }\n  return ok(values);\n};\n\ntype CombineTuple<R extends readonly Result<unknown, unknown>[]> = Result<\n  { [K in keyof R]: InferOk<R[K]> },\n  { [K in keyof R]: InferErr<R[K]> }[number]\n>;\n\n/**\n * Heterogeneous tuple combine — like {@link combine} but preserves each\n * branch's `Ok` type by position, so the result destructures type-safely.\n * Short-circuits on the first `Err` in input order (neverthrow-style).\n *\n * @example\n * ```ts\n * const r = combineTuple([ok(1), ok(\"x\")] as const);\n * // Result<readonly [number, string], never>\n * if (isOk(r)) {\n *   const [n, s] = r.value;   // typed per position\n * }\n * ```\n */\nexport const combineTuple = <const R extends readonly Result<unknown, unknown>[]>(\n  results: R,\n): CombineTuple<R> =>\n  // Runtime identical to combine; the cast restores per-index tuple types.\n  combine(results as readonly Result<unknown, unknown>[]) as CombineTuple<R>;\n\n/**\n * Accumulate independent validation failures. Returns `Ok<T[]>` only when\n * every input is `Ok`. Without a combiner, failures are collected into a\n * readonly array; with `combineErrors` they are folded into a single `E`.\n *\n * Unlike {@link combine}, this does **not** short-circuit on first failure —\n * use for independent checks where you want to report all problems at once.\n *\n * @example\n * ```ts\n * const checks: Result<string, string[]>[] = [ok(\"Ada\"), err([\"age required\"])];\n *\n * validateAll(checks);\n * // Result<string[], readonly string[][]>\n *\n * validateAll(checks, (left, right) => [...left, ...right]);\n * // Result<string[], string[]>\n * ```\n */\nexport function validateAll<T, E>(results: readonly Result<T, E>[]): Result<T[], readonly E[]>;\nexport function validateAll<T, E>(\n  results: readonly Result<T, E>[],\n  combineErrors: (left: E, right: E) => E,\n): Result<T[], E>;\nexport function validateAll<T, E>(\n  results: readonly Result<T, E>[],\n  combineErrors?: (left: E, right: E) => E,\n): Result<T[], E | readonly E[]> {\n  const values: T[] = [];\n  const errors: E[] = [];\n\n  for (const result of results) {\n    if (isErr(result)) {\n      errors.push(result.error);\n    } else {\n      values.push(result.value);\n    }\n  }\n\n  if (errors.length === 0) return ok(values);\n  return err(combineErrors ? errors.reduce(combineErrors) : errors);\n}\n\n/**\n * Tuple-preserving variant of {@link validateAll}. Heterogeneous input tuple\n * → preserved `Ok` tuple shape. Without a combiner, the error union is\n * collected into a readonly array; with `combineErrors`, all inputs must\n * share the error type `E` and failures fold into a single `E`.\n *\n * @example\n * ```ts\n * const name: Result<string, string[]> = ok(\"Ada\");\n * const age: Result<number, string[]> = ok(36);\n *\n * validateTuple([name, age] as const);\n * // Result<readonly [string, number], readonly string[][]>\n *\n * validateTuple([name, age] as const, (l, r) => [...l, ...r]);\n * // Result<readonly [string, number], string[]>\n * ```\n */\nexport function validateTuple<const R extends readonly Result<unknown, unknown>[]>(\n  results: R,\n): Result<{ [K in keyof R]: InferOk<R[K]> }, readonly InferErr<R[number]>[]>;\nexport function validateTuple<\n  const R extends readonly Result<unknown, unknown>[],\n  E = InferErr<R[number]>,\n>(\n  results: R & readonly Result<unknown, E>[],\n  combineErrors: (left: E, right: E) => E,\n): Result<{ [K in keyof R]: InferOk<R[K]> }, E>;\nexport function validateTuple(\n  results: readonly Result<unknown, unknown>[],\n  combineErrors?: (left: unknown, right: unknown) => unknown,\n): Result<readonly unknown[], unknown> {\n  // Runtime identical to validateAll; the overloads restore per-index tuple types.\n  return combineErrors ? validateAll(results, combineErrors) : validateAll(results);\n}\n","/**\n * Variadic point-free composition — chains up to nine unary fns left-to-right\n * into one reusable function. The first fn may take multiple arguments; the\n * rest are unary. Use {@link pipe} from `@onrails/result` when you already\n * have a starting value; use {@link flow} to define a reusable composed\n * function with no value yet.\n *\n * @example\n * ```ts\n * const parseUserName = flow(\n *   (raw: string) => parseConfig(raw),\n *   map((cfg) => cfg.user),\n *   flatMap((u) => (u.name ? ok(u.name) : err({ kind: \"missing\" as const }))),\n * );\n *\n * parseUserName(raw); // Result<string, ParseError | { kind: \"missing\" }>\n * ```\n */\nexport function flow<A extends readonly unknown[], B>(ab: (...a: A) => B): (...a: A) => B;\nexport function flow<A extends readonly unknown[], B, C>(\n  ab: (...a: A) => B,\n  bc: (b: B) => C,\n): (...a: A) => C;\nexport function flow<A extends readonly unknown[], B, C, D>(\n  ab: (...a: A) => B,\n  bc: (b: B) => C,\n  cd: (c: C) => D,\n): (...a: A) => D;\nexport function flow<A extends readonly unknown[], B, C, D, E>(\n  ab: (...a: A) => B,\n  bc: (b: B) => C,\n  cd: (c: C) => D,\n  de: (d: D) => E,\n): (...a: A) => E;\nexport function flow<A extends readonly unknown[], B, C, D, E, F>(\n  ab: (...a: A) => B,\n  bc: (b: B) => C,\n  cd: (c: C) => D,\n  de: (d: D) => E,\n  ef: (e: E) => F,\n): (...a: A) => F;\nexport function flow<A extends readonly unknown[], B, C, D, E, F, G>(\n  ab: (...a: A) => B,\n  bc: (b: B) => C,\n  cd: (c: C) => D,\n  de: (d: D) => E,\n  ef: (e: E) => F,\n  fg: (f: F) => G,\n): (...a: A) => G;\nexport function flow<A extends readonly unknown[], B, C, D, E, F, G, H>(\n  ab: (...a: A) => B,\n  bc: (b: B) => C,\n  cd: (c: C) => D,\n  de: (d: D) => E,\n  ef: (e: E) => F,\n  fg: (f: F) => G,\n  gh: (g: G) => H,\n): (...a: A) => H;\nexport function flow<A extends readonly unknown[], B, C, D, E, F, G, H, I>(\n  ab: (...a: A) => B,\n  bc: (b: B) => C,\n  cd: (c: C) => D,\n  de: (d: D) => E,\n  ef: (e: E) => F,\n  fg: (f: F) => G,\n  gh: (g: G) => H,\n  hi: (h: H) => I,\n): (...a: A) => I;\nexport function flow(\n  first: (...args: unknown[]) => unknown,\n  ...rest: ReadonlyArray<(x: unknown) => unknown>\n): (...args: unknown[]) => unknown {\n  return (...args: unknown[]) => {\n    let acc = first(...args);\n    for (const fn of rest) {\n      acc = fn(acc);\n    }\n    return acc;\n  };\n}\n","import { err, isErr } from \"./result.js\";\nimport type { Result } from \"./types.js\";\n\n/** Internal control-flow signal — not part of public error types */\nclass ErrSignal<E> {\n  readonly _tag = \"ErrSignal\" as const;\n  constructor(readonly error: E) {}\n}\n\n/**\n * Unwraps a {@link Result} inside a {@link tryGen} block — the sync analogue of\n * Rust's `?` operator. On `Ok` it returns the value; on `Err` it short-circuits\n * the enclosing `tryGen`, which returns that `Err`. Only valid inside `tryGen`;\n * prefer {@link flatMap} / `pipe` for long pipelines.\n *\n * @returns the unwrapped `Ok` value\n *\n * @example\n * ```ts\n * const out = tryGen(() => {\n *   const a = yieldResult(parseA());   // unwrap or short-circuit\n *   const b = yieldResult(parseB());\n *   return ok(a + b);\n * });\n * ```\n */\nexport const yieldResult = <T, E>(result: Result<T, E>): T => {\n  if (isErr(result)) {\n    throw new ErrSignal(result.error);\n  }\n  return result.value;\n};\n\n/**\n * Terse alias of {@link yieldResult} (mirrors Rust's `?`), for compact\n * {@link tryGen} blocks.\n *\n * @example\n * ```ts\n * const out = tryGen(() => {\n *   const a = $(parseA());\n *   const b = $(parseB());\n *   return ok(a + b);\n * });\n * ```\n */\nexport const $ = yieldResult;\n\n/**\n * Run a block that uses {@link yieldResult}; returns the final `Result` or the first Err.\n *\n * @example\n * ```ts\n * const out = tryGen(() => {\n *   const a = $(parseA());\n *   const b = $(parseB());\n *   return ok(a + b);\n * });\n * ```\n */\nexport const tryGen = <T, E>(fn: () => Result<T, E>): Result<T, E> => {\n  try {\n    return fn();\n  } catch (error) {\n    if (error instanceof ErrSignal) {\n      return err(error.error);\n    }\n    throw error;\n  }\n};\n"]}