awaitly 1.31.1 → 1.32.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.
Files changed (169) hide show
  1. package/dist/adapters.cjs +2 -2
  2. package/dist/adapters.cjs.map +1 -1
  3. package/dist/adapters.d.cts +3 -1
  4. package/dist/adapters.d.ts +3 -1
  5. package/dist/adapters.js +2 -2
  6. package/dist/adapters.js.map +1 -1
  7. package/dist/batch.cjs +2 -2
  8. package/dist/batch.cjs.map +1 -1
  9. package/dist/batch.d.cts +3 -1
  10. package/dist/batch.d.ts +3 -1
  11. package/dist/batch.js +2 -2
  12. package/dist/batch.js.map +1 -1
  13. package/dist/circuit-breaker.cjs +2 -2
  14. package/dist/circuit-breaker.cjs.map +1 -1
  15. package/dist/circuit-breaker.d.cts +3 -1
  16. package/dist/circuit-breaker.d.ts +3 -1
  17. package/dist/circuit-breaker.js +2 -2
  18. package/dist/circuit-breaker.js.map +1 -1
  19. package/dist/conditional.d.cts +3 -1
  20. package/dist/conditional.d.ts +3 -1
  21. package/dist/core.cjs +2 -2
  22. package/dist/core.cjs.map +1 -1
  23. package/dist/core.d.cts +2 -1
  24. package/dist/core.d.ts +2 -1
  25. package/dist/core.js +2 -2
  26. package/dist/core.js.map +1 -1
  27. package/dist/diagnostics.cjs +3 -3
  28. package/dist/diagnostics.cjs.map +1 -1
  29. package/dist/diagnostics.d.cts +3 -1
  30. package/dist/diagnostics.d.ts +3 -1
  31. package/dist/diagnostics.js +3 -3
  32. package/dist/diagnostics.js.map +1 -1
  33. package/dist/durable.cjs +3 -3
  34. package/dist/durable.cjs.map +1 -1
  35. package/dist/durable.d.cts +8 -361
  36. package/dist/durable.d.ts +8 -361
  37. package/dist/durable.js +3 -3
  38. package/dist/durable.js.map +1 -1
  39. package/dist/engine.cjs +11 -0
  40. package/dist/engine.cjs.map +1 -0
  41. package/dist/engine.d.cts +114 -0
  42. package/dist/engine.d.ts +114 -0
  43. package/dist/engine.js +11 -0
  44. package/dist/engine.js.map +1 -0
  45. package/dist/errors-entry-CMH73Eym.d.cts +339 -0
  46. package/dist/errors-entry-DOt5UUl4.d.ts +339 -0
  47. package/dist/errors.cjs +1 -1
  48. package/dist/errors.cjs.map +1 -1
  49. package/dist/errors.d.cts +2 -318
  50. package/dist/errors.d.ts +2 -318
  51. package/dist/errors.js +1 -1
  52. package/dist/errors.js.map +1 -1
  53. package/dist/fetch.cjs +2 -2
  54. package/dist/fetch.cjs.map +1 -1
  55. package/dist/fetch.d.cts +3 -1
  56. package/dist/fetch.d.ts +3 -1
  57. package/dist/fetch.js +2 -2
  58. package/dist/fetch.js.map +1 -1
  59. package/dist/functional.cjs +1 -1
  60. package/dist/functional.cjs.map +1 -1
  61. package/dist/functional.d.cts +2 -0
  62. package/dist/functional.d.ts +2 -0
  63. package/dist/functional.js +1 -1
  64. package/dist/functional.js.map +1 -1
  65. package/dist/{guards-PU64_GKv.d.cts → guards-B79mP5Q8.d.cts} +3 -3
  66. package/dist/{guards-B5lgMJq0.d.ts → guards-BUq6NJCM.d.ts} +3 -3
  67. package/dist/{hitl-Dyiy0R1v.d.cts → hitl-BCqkMAHw.d.cts} +2 -2
  68. package/dist/{hitl-BjeSm1sJ.d.ts → hitl-BZtPx0aU.d.ts} +2 -2
  69. package/dist/hitl.cjs +2 -2
  70. package/dist/hitl.cjs.map +1 -1
  71. package/dist/hitl.d.cts +9 -6
  72. package/dist/hitl.d.ts +9 -6
  73. package/dist/hitl.js +2 -2
  74. package/dist/hitl.js.map +1 -1
  75. package/dist/index-BVUAOWGG.d.ts +417 -0
  76. package/dist/index-CQnpmUcC.d.cts +417 -0
  77. package/dist/index.cjs +1 -1
  78. package/dist/index.cjs.map +1 -1
  79. package/dist/index.d.cts +4 -3
  80. package/dist/index.d.ts +4 -3
  81. package/dist/index.js +1 -1
  82. package/dist/index.js.map +1 -1
  83. package/dist/otel.d.cts +3 -1
  84. package/dist/otel.d.ts +3 -1
  85. package/dist/{persistence-entry-B3ukwbb5.d.ts → persistence-entry-ClFhxd2Q.d.ts} +11 -5
  86. package/dist/{persistence-entry-CgVzswbg.d.cts → persistence-entry-jflY61az.d.cts} +11 -5
  87. package/dist/persistence.d.cts +6 -3
  88. package/dist/persistence.d.ts +6 -3
  89. package/dist/policies.d.cts +3 -1
  90. package/dist/policies.d.ts +3 -1
  91. package/dist/ratelimit.cjs +2 -2
  92. package/dist/ratelimit.cjs.map +1 -1
  93. package/dist/ratelimit.d.cts +3 -1
  94. package/dist/ratelimit.d.ts +3 -1
  95. package/dist/ratelimit.js +2 -2
  96. package/dist/ratelimit.js.map +1 -1
  97. package/dist/reliability.cjs +2 -2
  98. package/dist/reliability.cjs.map +1 -1
  99. package/dist/reliability.d.cts +3 -1
  100. package/dist/reliability.d.ts +3 -1
  101. package/dist/reliability.js +2 -2
  102. package/dist/reliability.js.map +1 -1
  103. package/dist/resolver.cjs +2 -2
  104. package/dist/resolver.cjs.map +1 -1
  105. package/dist/resolver.d.cts +5 -3
  106. package/dist/resolver.d.ts +5 -3
  107. package/dist/resolver.js +2 -2
  108. package/dist/resolver.js.map +1 -1
  109. package/dist/resource.cjs +2 -2
  110. package/dist/resource.cjs.map +1 -1
  111. package/dist/resource.d.cts +3 -1
  112. package/dist/resource.d.ts +3 -1
  113. package/dist/resource.js +2 -2
  114. package/dist/resource.js.map +1 -1
  115. package/dist/result/retry.cjs +1 -1
  116. package/dist/result/retry.cjs.map +1 -1
  117. package/dist/result/retry.d.cts +2 -0
  118. package/dist/result/retry.d.ts +2 -0
  119. package/dist/result/retry.js +1 -1
  120. package/dist/result/retry.js.map +1 -1
  121. package/dist/result.cjs +1 -1
  122. package/dist/result.cjs.map +1 -1
  123. package/dist/result.d.cts +8 -23
  124. package/dist/result.d.ts +8 -23
  125. package/dist/result.js +1 -1
  126. package/dist/result.js.map +1 -1
  127. package/dist/{run-entry-C1uFytM6.d.cts → run-entry-rw7zll_G.d.ts} +16 -45
  128. package/dist/{run-entry-C1uFytM6.d.ts → run-entry-yQu63Yj9.d.cts} +16 -45
  129. package/dist/run.cjs +2 -2
  130. package/dist/run.cjs.map +1 -1
  131. package/dist/run.d.cts +3 -1
  132. package/dist/run.d.ts +3 -1
  133. package/dist/run.js +2 -2
  134. package/dist/run.js.map +1 -1
  135. package/dist/saga.cjs +2 -2
  136. package/dist/saga.cjs.map +1 -1
  137. package/dist/saga.d.cts +3 -1
  138. package/dist/saga.d.ts +3 -1
  139. package/dist/saga.js +2 -2
  140. package/dist/saga.js.map +1 -1
  141. package/dist/singleflight.d.cts +3 -1
  142. package/dist/singleflight.d.ts +3 -1
  143. package/dist/streaming.cjs +4 -4
  144. package/dist/streaming.cjs.map +1 -1
  145. package/dist/streaming.d.cts +5 -3
  146. package/dist/streaming.d.ts +5 -3
  147. package/dist/streaming.js +4 -4
  148. package/dist/streaming.js.map +1 -1
  149. package/dist/testing.cjs +8 -4
  150. package/dist/testing.cjs.map +1 -1
  151. package/dist/testing.d.cts +87 -4
  152. package/dist/testing.d.ts +87 -4
  153. package/dist/testing.js +8 -4
  154. package/dist/testing.js.map +1 -1
  155. package/dist/{types-wa_wTOn3.d.ts → types-CuWK5AlK.d.ts} +1 -1
  156. package/dist/{types-DUWrNIJu.d.cts → types-uR3JpwvF.d.cts} +1 -1
  157. package/dist/webhook.cjs +2 -2
  158. package/dist/webhook.cjs.map +1 -1
  159. package/dist/webhook.d.cts +7 -4
  160. package/dist/webhook.d.ts +7 -4
  161. package/dist/webhook.js +2 -2
  162. package/dist/webhook.js.map +1 -1
  163. package/dist/workflow.cjs +3 -3
  164. package/dist/workflow.cjs.map +1 -1
  165. package/dist/workflow.d.cts +47 -11
  166. package/dist/workflow.d.ts +47 -11
  167. package/dist/workflow.js +3 -3
  168. package/dist/workflow.js.map +1 -1
  169. package/package.json +15 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/result/index.ts","../src/functional/index.ts"],"sourcesContent":["/**\n * awaitly/result (internal)\n *\n * Core Result primitives - minimal bundle for typed error handling.\n * This file is intentionally kept small for optimal tree-shaking.\n * The full orchestration (run, step, etc.) lives in core.ts.\n */\n\n// =============================================================================\n// Core Result Types\n// =============================================================================\n\n/**\n * Represents a successful result.\n * Use `ok(value)` to create instances.\n */\nexport type Ok<T> = {\n ok: true;\n value: T;\n};\n\n/**\n * Represents a failed result.\n * Use `err(error)` to create instances.\n */\nexport type Err<E, C = unknown> = {\n ok: false;\n error: E;\n cause?: C;\n};\n\n/**\n * Represents a successful computation or a failed one.\n */\nexport type Result<T, E = unknown, C = unknown> = Ok<T> | Err<E, C>;\n\n/**\n * A Promise that resolves to a Result.\n */\nexport type AsyncResult<T, E = unknown, C = unknown> = Promise<Result<T, E, C>>;\n\nexport type UnexpectedStepFailureCause =\n | {\n type: \"STEP_FAILURE\";\n origin: \"result\";\n error: unknown;\n cause?: unknown;\n }\n | {\n type: \"STEP_FAILURE\";\n origin: \"throw\";\n error: unknown;\n thrown: unknown;\n };\n\nexport type UnexpectedCause =\n | { type: \"UNCAUGHT_EXCEPTION\"; thrown: unknown }\n | UnexpectedStepFailureCause;\n\n/** Discriminant for UnexpectedError type - use in switch statements */\nexport const UNEXPECTED_ERROR = \"UNEXPECTED_ERROR\" as const;\n\n/** Discriminant for PromiseRejectedError type - use in switch statements */\nexport const PROMISE_REJECTED = \"PROMISE_REJECTED\" as const;\n\n// =============================================================================\n// Named Error Constants (for static analysis)\n// =============================================================================\n\n/**\n * Named error constant for unexpected/unhandled errors.\n * Used by the analyzer when a step doesn't declare errors.\n */\nexport const AWAITLY_UNEXPECTED = \"AWAITLY_UNEXPECTED\" as const;\n\n/**\n * Named error constant for cancelled operations.\n */\nexport const AWAITLY_CANCELLED = \"AWAITLY_CANCELLED\" as const;\n\n/**\n * Named error constant for timed-out operations.\n */\nexport const AWAITLY_TIMEOUT = \"AWAITLY_TIMEOUT\" as const;\n\n// =============================================================================\n// Static Analysis Helpers\n// =============================================================================\n\n/**\n * Helper to create a tuple of string literal tags with preserved literal types.\n * Use this when you need to store error tags in a variable while keeping\n * TypeScript's literal type inference (avoiding widening to string[]).\n *\n * @param t - The string literal tags\n * @returns The same array with preserved literal types\n *\n * @example\n * ```typescript\n * // Without tags() - type widens to string[]\n * const errs = ['CART_NOT_FOUND', 'CART_EMPTY']; // string[]\n *\n * // With tags() - literal types preserved\n * const errs = tags('CART_NOT_FOUND', 'CART_EMPTY'); // readonly ['CART_NOT_FOUND', 'CART_EMPTY']\n *\n * await step('getCart', () => getCart(id), {\n * errors: errs, // Analyzer can extract literal types\n * out: 'cart',\n * });\n * ```\n */\nexport const tags = <const T extends readonly string[]>(...t: T): T => t;\n\nexport type UnexpectedError = {\n type: typeof UNEXPECTED_ERROR;\n cause: UnexpectedCause;\n};\nexport type PromiseRejectedError = { type: typeof PROMISE_REJECTED; cause: unknown };\n/** Cause type for promise rejections in async batch helpers */\nexport type PromiseRejectionCause = { type: \"PROMISE_REJECTION\"; reason: unknown };\nexport type EmptyInputError = { type: \"EMPTY_INPUT\"; message: string };\nexport type MaybeAsyncResult<T, E, C = unknown> = Result<T, E, C> | Promise<Result<T, E, C>>;\n\n// =============================================================================\n// Result Constructors\n// =============================================================================\n\n/**\n * Creates a successful Result.\n *\n * @remarks When to use: Wrap a successful value in a Result for consistent return types.\n */\nexport function ok(): Ok<void>;\nexport function ok<T>(value: T): Ok<T>;\nexport function ok<T>(value?: T): Ok<T | void> {\n return { ok: true as const, value: value as T | void };\n}\n\n/**\n * Creates a failed Result.\n *\n * @remarks When to use: Return a typed failure without throwing so callers can handle it explicitly.\n */\nexport function err<E, C = unknown>(error: E, options?: { cause?: C }): Err<E, C> {\n const cause = options?.cause;\n return { ok: false as const, error, ...(cause !== undefined ? { cause } : {}) } as Err<E, C>;\n}\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n/**\n * Checks if a Result is successful.\n *\n * @remarks When to use: Prefer functional-style checks or array filtering over `result.ok`.\n */\nexport const isOk = <T, E, C>(r: Result<T, E, C>): r is Ok<T> => r.ok;\n\n/**\n * Checks if a Result is a failure.\n *\n * @remarks When to use: Prefer functional-style checks or array filtering over `result.ok`.\n */\nexport const isErr = <T, E, C>(r: Result<T, E, C>): r is Err<E, C> => !r.ok;\n\n/**\n * Checks if an error is an UnexpectedError.\n *\n * @remarks When to use: Distinguish unexpected failures from your typed error union.\n */\nexport const isUnexpectedError = (e: unknown): e is UnexpectedError =>\n typeof e === \"object\" &&\n e !== null &&\n \"type\" in e &&\n e.type === UNEXPECTED_ERROR;\n\n/**\n * Checks if an error is a PromiseRejectedError.\n */\nexport const isPromiseRejectedError = (e: unknown): e is PromiseRejectedError =>\n typeof e === \"object\" &&\n e !== null &&\n \"type\" in e &&\n e.type === PROMISE_REJECTED;\n\n// =============================================================================\n// Error Matching\n// =============================================================================\n\nexport type MatchErrorHandlers<E extends string, R> = {\n [K in E]: (error: K extends \"UNEXPECTED_ERROR\" ? UnexpectedError : K) => R;\n};\n\n/**\n * Match on string error types with exhaustive checking.\n * Takes an error value (not a Result) and handlers for each error type.\n */\nexport function matchError<E extends string, R>(\n error: E | UnexpectedError,\n handlers: MatchErrorHandlers<E, R>\n): R {\n // Handle UnexpectedError objects\n if (isUnexpectedError(error)) {\n return (handlers as MatchErrorHandlers<\"UNEXPECTED_ERROR\", R>).UNEXPECTED_ERROR(error);\n }\n // Handle the string literal \"UNEXPECTED_ERROR\" - wrap it in an UnexpectedError object\n // to maintain the typed contract that UNEXPECTED_ERROR handler receives an object\n if (error === \"UNEXPECTED_ERROR\") {\n const syntheticError: UnexpectedError = {\n type: UNEXPECTED_ERROR,\n cause: { type: \"UNCAUGHT_EXCEPTION\", thrown: error },\n };\n return (handlers as MatchErrorHandlers<\"UNEXPECTED_ERROR\", R>).UNEXPECTED_ERROR(syntheticError);\n }\n // Cast to the excluded type since we've handled UNEXPECTED_ERROR above\n type StringErrors = Exclude<E, \"UNEXPECTED_ERROR\">;\n return (handlers as unknown as Record<string, (e: string) => R>)[error as StringErrors](error as StringErrors);\n}\n\n// =============================================================================\n// Type Utilities\n// =============================================================================\n\ntype AnyFunction = (...args: never[]) => unknown;\n\n/**\n * Helper to extract the error type from Result or AsyncResult return values.\n * Works even when a function is declared to return a union of both forms.\n */\ntype ErrorOfReturn<R> = Extract<Awaited<R>, { ok: false }> extends { error: infer E }\n ? E\n : never;\n\n/**\n * Extract error type from a single function's return type\n */\nexport type ErrorOf<T extends AnyFunction> = ErrorOfReturn<ReturnType<T>>;\n\n/**\n * Extract union of error types from multiple functions\n */\nexport type Errors<T extends AnyFunction[]> = {\n [K in keyof T]: ErrorOf<T[K]>;\n}[number];\n\n/**\n * Extract value type from Result\n */\nexport type ExtractValue<T> = T extends { ok: true; value: infer U }\n ? U\n : never;\n\n/**\n * Extract error type from Result\n */\nexport type ExtractError<T> = T extends { ok: false; error: infer E }\n ? E\n : never;\n\n/**\n * Extract cause type from Result\n */\nexport type ExtractCause<T> = T extends { ok: false; cause?: infer C }\n ? C\n : never;\n\n/**\n * Helper to extract the cause type from Result or AsyncResult return values.\n * Works even when a function is declared to return a union of both forms.\n */\ntype CauseOfReturn<R> = Extract<Awaited<R>, { ok: false }> extends { cause?: infer C }\n ? C\n : never;\n\n/**\n * Extract cause type from a function's return type\n */\nexport type CauseOf<T extends AnyFunction> = CauseOfReturn<ReturnType<T>>;\n\n// =============================================================================\n// Unwrap Utilities\n// =============================================================================\n\n/**\n * Error thrown when attempting to unwrap an Err result.\n */\nexport class UnwrapError extends Error {\n public readonly error: unknown;\n public readonly cause?: unknown;\n\n constructor(result: Err<unknown, unknown>) {\n const errorStr =\n typeof result.error === \"string\"\n ? result.error\n : JSON.stringify(result.error);\n super(`Attempted to unwrap an Err: ${errorStr}`);\n this.name = \"UnwrapError\";\n this.error = result.error;\n this.cause = result.cause;\n }\n}\n\n/**\n * Extracts the value from an Ok result, or throws UnwrapError if it's an Err.\n *\n * @remarks When to use: Only at boundaries or tests where a failure should be fatal.\n */\nexport const unwrap = <T, E, C>(r: Result<T, E, C>): T => {\n if (r.ok) return r.value;\n throw new UnwrapError(r);\n};\n\n/**\n * Extracts the value from an Ok result, or returns a default value if it's an Err.\n *\n * @remarks When to use: Provide a safe fallback without branching.\n */\nexport const unwrapOr = <T, E, C>(r: Result<T, E, C>, defaultValue: T): T =>\n r.ok ? r.value : defaultValue;\n\n/**\n * Extracts the value from an Ok result, or calls a function to get a default value if it's an Err.\n *\n * @remarks When to use: Compute a fallback from the error (logging, metrics, or derived defaults).\n */\nexport const unwrapOrElse = <T, E, C>(\n r: Result<T, E, C>,\n fn: (error: E, cause?: C) => T\n): T => (r.ok ? r.value : fn(r.error, r.cause));\n\n/**\n * Alias for `unwrap`. Returns the success value or throws.\n *\n * The Result is already computed; use when you want the value or throw (e.g. at boundaries or in tests).\n *\n * @param r - The Result to unwrap\n * @returns The success value if the Result is successful\n * @throws {UnwrapError} If the Result is an error (includes the error and cause)\n */\nexport const runOrThrow = <T, E, C>(r: Result<T, E, C>): T => unwrap(r);\n\n/**\n * Awaits a Promise of a Result, then returns the success value or rejects.\n *\n * The returned promise **resolves with T** on success and **rejects with UnwrapError** on failure.\n * UnwrapError extends Error and carries the original `error` and `cause` from the Err.\n *\n * @param ar - A Promise or thenable that resolves to a Result\n * @returns A Promise that resolves with the success value or rejects with UnwrapError\n */\nexport const runOrThrowAsync = <T, E, C>(\n ar: PromiseLike<Result<T, E, C>>\n): Promise<T> => Promise.resolve(ar).then(unwrap);\n\n/**\n * Convenience alias for `unwrapOr(r, null)`. Returns the success value or null.\n *\n * @param r - The Result to unwrap\n * @returns The success value if successful, otherwise null\n */\nexport const runOrNull = <T, E, C>(r: Result<T, E, C>): T | null =>\n r.ok ? r.value : null;\n\n/**\n * Convenience alias for `unwrapOr(r, undefined)`. Returns the success value or undefined.\n *\n * @param r - The Result to unwrap\n * @returns The success value if successful, otherwise undefined\n */\nexport const runOrUndefined = <T, E, C>(r: Result<T, E, C>): T | undefined =>\n r.ok ? r.value : undefined;\n\n// =============================================================================\n// Wrapping Functions\n// =============================================================================\n\n/**\n * Wraps a synchronous function that might throw into a Result.\n *\n * @remarks When to use: Wrap sync code that might throw so exceptions become Err values.\n */\nexport function from<T>(fn: () => T): Ok<T> | Err<unknown, unknown>;\nexport function from<T, E>(fn: () => T, onError: (cause: unknown) => E): Ok<T> | Err<E, unknown>;\nexport function from<T, E>(fn: () => T, onError?: (cause: unknown) => E) {\n try {\n return ok(fn());\n } catch (cause) {\n return onError ? err(onError(cause), { cause }) : err(cause);\n }\n}\n\n/**\n * Wraps a Promise into a Result.\n *\n * @remarks When to use: Wrap a Promise and keep the raw rejection as Err; use tryAsync to map errors.\n */\nexport function fromPromise<T>(promise: Promise<T>): Promise<Ok<T> | Err<unknown, unknown>>;\nexport function fromPromise<T, E>(\n promise: Promise<T>,\n onError: (cause: unknown) => E\n): Promise<Ok<T> | Err<E, unknown>>;\nexport async function fromPromise<T, E>(\n promise: Promise<T>,\n onError?: (cause: unknown) => E\n): Promise<Ok<T> | Err<E | unknown, unknown>> {\n try {\n return ok(await promise);\n } catch (cause) {\n return onError ? err(onError(cause), { cause }) : err(cause);\n }\n}\n\n/**\n * Wraps an async function that might throw into an AsyncResult.\n *\n * @remarks When to use: Wrap async work and map thrown/rejected values into your typed error union.\n */\nexport function tryAsync<T>(fn: () => Promise<T>): AsyncResult<T, unknown>;\nexport function tryAsync<T, E>(\n fn: () => Promise<T>,\n onError: (cause: unknown) => E\n): AsyncResult<T, E>;\nexport async function tryAsync<T, E>(\n fn: () => Promise<T>,\n onError?: (cause: unknown) => E\n): AsyncResult<T, E | unknown> {\n try {\n return ok(await fn());\n } catch (cause) {\n return onError ? err(onError(cause), { cause }) : err(cause);\n }\n}\n\n/**\n * Converts a nullable value into a Result.\n *\n * @remarks When to use: Turn null/undefined into a typed error before continuing.\n */\nexport function fromNullable<T, E>(\n value: T | null | undefined,\n onNull: () => E\n): Result<T, E> {\n return value != null ? ok(value) : err(onNull());\n}\n\n// =============================================================================\n// Transformers\n// =============================================================================\n\n/**\n * Transforms the value inside an Ok result.\n *\n * @remarks When to use: Transform only the Ok value while leaving Err untouched.\n */\nexport function map<T, U>(r: Ok<T>, fn: (value: T) => U): Ok<U>;\nexport function map<T, U, E, C>(r: Err<E, C>, fn: (value: T) => U): Err<E, C>;\nexport function map<T, U, E, C>(r: Result<T, E, C>, fn: (value: T) => U): Result<U, E, C>;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function map(r: any, fn: any): any {\n return r.ok ? ok(fn(r.value)) : r;\n}\n\n/**\n * Transforms the error inside an Err result.\n *\n * @remarks When to use: Retype or normalize errors while leaving Ok values unchanged.\n */\nexport function mapError<T, E, F, C>(\n r: Result<T, E, C>,\n fn: (error: E, cause?: C) => F\n): Result<T, F, C> {\n return r.ok ? r : err(fn(r.error, r.cause), { cause: r.cause });\n}\n\n/**\n * Pattern match on a Result.\n *\n * @remarks When to use: Handle both Ok and Err in a single expression that returns a value.\n */\nexport function match<T, E, C, R>(r: Ok<T>, handlers: { ok: (value: T) => R; err: (error: E, cause?: C) => R }): R;\nexport function match<T, E, C, R>(r: Err<E, C>, handlers: { ok: (value: T) => R; err: (error: E, cause?: C) => R }): R;\nexport function match<T, E, C, R>(r: Result<T, E, C>, handlers: { ok: (value: T) => R; err: (error: E, cause?: C) => R }): R;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function match(r: any, handlers: any): any {\n return r.ok ? handlers.ok(r.value) : handlers.err(r.error, r.cause);\n}\n\n/**\n * Chain Result-returning functions.\n *\n * @remarks When to use: Chain dependent operations that return Result without nested branching.\n */\nexport function andThen<T, U>(r: Ok<T>, fn: (value: T) => Ok<U>): Ok<U>;\nexport function andThen<T, F, C2>(r: Ok<T>, fn: (value: T) => Err<F, C2>): Err<F, C2>;\nexport function andThen<T, U, F, C2>(r: Ok<T>, fn: (value: T) => Result<U, F, C2>): Result<U, F, C2>;\nexport function andThen<T, U, E, F, C1, C2>(r: Err<E, C1>, fn: (value: T) => Result<U, F, C2>): Err<E, C1>;\nexport function andThen<T, U, E, F, C1, C2>(r: Result<T, E, C1>, fn: (value: T) => Result<U, F, C2>): Result<U, E | F, C1 | C2>;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function andThen(r: any, fn: any): any {\n return r.ok ? fn(r.value) : r;\n}\n\n/**\n * Execute a side effect on Ok values.\n *\n * @remarks When to use: Add side effects (logging, metrics) on Ok without changing the Result.\n */\nexport function tap<T, E, C>(\n r: Result<T, E, C>,\n fn: (value: T) => void\n): Result<T, E, C> {\n if (r.ok) fn(r.value);\n return r;\n}\n\n/**\n * Execute a side effect on Err values.\n *\n * @remarks When to use: Add side effects (logging, metrics) on Err without changing the Result.\n */\nexport function tapError<T, E, C>(\n r: Result<T, E, C>,\n fn: (error: E, cause?: C) => void\n): Result<T, E, C> {\n if (!r.ok) fn(r.error, r.cause);\n return r;\n}\n\n/**\n * Transform value with a function that might throw.\n *\n * @remarks When to use: Transform Ok values with a function that might throw and capture the failure.\n */\nexport function mapTry<T, U, E, F, C>(\n r: Result<T, E, C>,\n fn: (value: T) => U,\n onError: (thrown: unknown) => F\n): Result<U, E | F, C | unknown> {\n if (!r.ok) return r;\n try {\n return ok(fn(r.value));\n } catch (error) {\n return err(onError(error), { cause: error });\n }\n}\n\n/**\n * Transform error with a function that might throw.\n *\n * @remarks When to use: Transform errors when the mapping might throw and you want that captured.\n */\nexport function mapErrorTry<T, E, F, G, C>(\n r: Result<T, E, C>,\n fn: (error: E) => F,\n onError: (thrown: unknown) => G\n): Result<T, F | G, C | unknown> {\n if (r.ok) return r;\n try {\n return err(fn(r.error), { cause: r.cause });\n } catch (error) {\n return err(onError(error), { cause: error });\n }\n}\n\n/**\n * Transform both value and error.\n */\nexport function bimap<T, U, E, F, C>(\n r: Result<T, E, C>,\n onOk: (value: T) => U,\n onErr: (error: E, cause?: C) => F\n): Result<U, F, C> {\n return r.ok ? ok(onOk(r.value)) : err(onErr(r.error, r.cause), { cause: r.cause });\n}\n\n/**\n * Provide an alternative Result if the first is an Err.\n *\n * @remarks When to use: Recover from Err by returning a fallback Result or retyping the error.\n */\nexport function orElse<T, E, E2, C, C2>(\n r: Result<T, E, C>,\n fn: (error: E, cause?: C) => Result<T, E2, C2>\n): Result<T, E2, C | C2> {\n return r.ok ? r : fn(r.error, r.cause);\n}\n\n/**\n * Async version of orElse.\n */\nexport async function orElseAsync<T, E, E2, C, C2>(\n r: Result<T, E, C>,\n fn: (error: E, cause?: C) => Promise<Result<T, E2, C2>>\n): Promise<Result<T, E2, C | C2>> {\n return r.ok ? r : fn(r.error, r.cause);\n}\n\n/**\n * Recover from errors - always returns Ok<T>.\n */\nexport function recover<T, E, C>(\n r: Result<T, E, C>,\n fn: (error: E, cause?: C) => T\n): Ok<T> {\n return r.ok ? ok(r.value) : ok(fn(r.error, r.cause));\n}\n\n/**\n * Async version of recover - always returns Promise<Ok<T>>.\n */\nexport async function recoverAsync<T, E, C>(\n r: Result<T, E, C> | Promise<Result<T, E, C>>,\n fn: (error: E, cause?: C) => T | Promise<T>\n): Promise<Ok<T>> {\n const resolved = await r;\n if (resolved.ok) return ok(resolved.value);\n return ok(await fn(resolved.error, resolved.cause));\n}\n\n// =============================================================================\n// Result Hydration (Serialization)\n// =============================================================================\n\n/**\n * Hydrate a serialized Result back into a proper Result object.\n */\nexport function hydrate<T, E, C = unknown>(value: unknown): Result<T, E, C> | null {\n if (typeof value !== \"object\" || value === null) return null;\n if (!(\"ok\" in value)) return null;\n\n const obj = value as Record<string, unknown>;\n if (obj.ok === true && \"value\" in obj) {\n return ok(obj.value as T);\n }\n if (obj.ok === false && \"error\" in obj) {\n return err(obj.error as E, { cause: obj.cause as C });\n }\n return null;\n}\n\n/**\n * Type guard to check if a value is a serialized Result.\n */\nexport function isSerializedResult(\n value: unknown\n): value is { ok: boolean; value?: unknown; error?: unknown; cause?: unknown } {\n if (typeof value !== \"object\" || value === null) return false;\n if (!(\"ok\" in value)) return false;\n const obj = value as Record<string, unknown>;\n return (\n (obj.ok === true && \"value\" in obj) ||\n (obj.ok === false && \"error\" in obj)\n );\n}\n\n// =============================================================================\n// Batch Operations\n// =============================================================================\n\ntype AllValues<T extends readonly Result<unknown, unknown, unknown>[]> = {\n [K in keyof T]: T[K] extends Ok<infer V>\n ? V\n : T[K] extends Err<unknown, unknown>\n ? never\n : T[K] extends Result<infer V, unknown, unknown>\n ? V\n : never;\n};\ntype AllErrors<T extends readonly Result<unknown, unknown, unknown>[]> = {\n [K in keyof T]: T[K] extends Ok<unknown>\n ? never\n : T[K] extends Err<infer E, unknown>\n ? E\n : T[K] extends Result<unknown, infer E, unknown>\n ? E\n : never;\n}[number];\ntype AllCauses<T extends readonly Result<unknown, unknown, unknown>[]> = {\n [K in keyof T]: T[K] extends Ok<unknown>\n ? never\n : T[K] extends Err<unknown, infer C>\n ? C\n : T[K] extends Result<unknown, unknown, infer C>\n ? C\n : never;\n}[number];\n\n// Conditional type: returns Ok<...> when there are no errors, Result<...> otherwise\n// Note: We only check AllErrors, not AllCauses - causes only matter when there are errors\ntype AllResult<T extends readonly Result<unknown, unknown, unknown>[]> =\n [AllErrors<T>] extends [never]\n ? Ok<AllValues<T>>\n : Result<AllValues<T>, AllErrors<T>, AllCauses<T>>;\n\n/**\n * Combines multiple Results into a single Result containing an array of values.\n * Returns the first Err encountered, or Ok with all values.\n */\nexport function all<const T extends readonly Result<unknown, unknown, unknown>[]>(\n results: T\n): AllResult<T> {\n const values: unknown[] = [];\n for (const result of results) {\n if (!result.ok) {\n return result as unknown as AllResult<T>;\n }\n values.push(result.value);\n }\n return ok(values) as AllResult<T>;\n}\n\n/**\n * Async version of all - works with Promises of Results.\n */\nexport async function allAsync<\n const T extends readonly (Result<unknown, unknown, unknown> | Promise<Result<unknown, unknown, unknown>>)[]\n>(\n results: T\n): Promise<\n Result<\n { [K in keyof T]: T[K] extends Result<infer V, unknown, unknown> | Promise<Result<infer V, unknown, unknown>> ? V : never },\n | { [K in keyof T]: T[K] extends Result<unknown, infer E, unknown> | Promise<Result<unknown, infer E, unknown>> ? E : never }[number]\n | PromiseRejectedError,\n | { [K in keyof T]: T[K] extends Result<unknown, unknown, infer C> | Promise<Result<unknown, unknown, infer C>> ? C : never }[number]\n | PromiseRejectionCause\n >\n> {\n const values: unknown[] = [];\n for (const resultOrPromise of results) {\n try {\n const r = await resultOrPromise;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (!r.ok) return r as any;\n values.push(r.value);\n } catch (reason) {\n return err(\n { type: PROMISE_REJECTED, cause: reason } as PromiseRejectedError,\n { cause: { type: \"PROMISE_REJECTION\", reason } as PromiseRejectionCause }\n );\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return ok(values) as any;\n}\n\nexport type SettledError<E, C = unknown> = { error: E; cause?: C };\n\n// Conditional type: returns Ok<...> when there are no errors, Result<...> otherwise\ntype AllSettledResult<T extends readonly Result<unknown, unknown, unknown>[]> =\n [AllErrors<T>] extends [never]\n ? Ok<AllValues<T>>\n : Result<AllValues<T>, SettledError<AllErrors<T>, AllCauses<T>>[]>;\n\n/**\n * Collects all Results, returning Ok with values if all succeed,\n * or Err with array of errors if any fail.\n */\nexport function allSettled<const T extends readonly Result<unknown, unknown, unknown>[]>(\n results: T\n): AllSettledResult<T> {\n const values: unknown[] = [];\n const errors: SettledError<unknown>[] = [];\n\n for (const result of results) {\n if (result.ok) {\n values.push(result.value);\n } else {\n errors.push({ error: result.error, cause: result.cause });\n }\n }\n\n if (errors.length > 0) {\n return err(errors) as unknown as AllSettledResult<T>;\n }\n\n return ok(values) as unknown as AllSettledResult<T>;\n}\n\n/**\n * Async version of allSettled.\n */\nexport async function allSettledAsync<\n const T extends readonly (Result<unknown, unknown, unknown> | Promise<Result<unknown, unknown, unknown>>)[]\n>(\n results: T\n): Promise<\n Result<\n { [K in keyof T]: T[K] extends Result<infer V, unknown, unknown> | Promise<Result<infer V, unknown, unknown>> ? V : never },\n SettledError<\n | { [K in keyof T]: T[K] extends Result<unknown, infer E, unknown> | Promise<Result<unknown, infer E, unknown>> ? E : never }[number]\n | PromiseRejectedError,\n | { [K in keyof T]: T[K] extends Result<unknown, unknown, infer C> | Promise<Result<unknown, unknown, infer C>> ? C : never }[number]\n | PromiseRejectionCause\n >[]\n >\n> {\n const settled = await Promise.all(\n results.map((item) =>\n Promise.resolve(item)\n .then((result) => ({ status: \"result\" as const, result }))\n .catch((reason) => ({\n status: \"rejected\" as const,\n error: { type: PROMISE_REJECTED, cause: reason } as PromiseRejectedError,\n cause: { type: \"PROMISE_REJECTION\", reason } as PromiseRejectionCause,\n }))\n )\n );\n\n const values: unknown[] = [];\n const errors: SettledError<unknown, unknown>[] = [];\n\n for (const item of settled) {\n if (item.status === \"rejected\") {\n errors.push({ error: item.error, cause: item.cause });\n } else if (item.result.ok) {\n values.push(item.result.value);\n } else {\n errors.push({ error: item.result.error, cause: item.result.cause });\n }\n }\n\n if (errors.length > 0) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return err(errors) as any;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return ok(values) as any;\n}\n\n/**\n * Partitions Results into { values, errors }.\n */\nexport function partition<T, E, C>(\n results: readonly Result<T, E, C>[]\n): { values: T[]; errors: E[] } {\n const values: T[] = [];\n const errors: E[] = [];\n for (const r of results) {\n if (r.ok) values.push(r.value);\n else errors.push(r.error);\n }\n return { values, errors };\n}\n\n/**\n * Returns the first Ok result, or an EmptyInputError/first Err if all fail.\n */\nexport function any<const T extends readonly Result<unknown, unknown, unknown>[]>(\n results: T\n): T extends readonly []\n ? Err<EmptyInputError, unknown>\n : Result<\n { [K in keyof T]: T[K] extends Result<infer V, unknown, unknown> ? V : never }[number],\n AllErrors<T> | EmptyInputError,\n AllCauses<T>\n >;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function any(results: any): any {\n if (results.length === 0) {\n return err({ type: \"EMPTY_INPUT\", message: \"any() requires at least one Result\" });\n }\n let firstErr: Err<unknown, unknown> | undefined;\n for (const r of results) {\n if (r.ok) return r;\n if (!firstErr) firstErr = r;\n }\n return firstErr;\n}\n\n/**\n * Async version of any - races promises and returns first success.\n */\nexport async function anyAsync<\n const T extends readonly (Result<unknown, unknown, unknown> | Promise<Result<unknown, unknown, unknown>>)[]\n>(\n results: T\n): Promise<\n T extends readonly []\n ? Err<EmptyInputError, unknown>\n : Result<\n { [K in keyof T]: T[K] extends Result<infer V, unknown, unknown> | Promise<Result<infer V, unknown, unknown>> ? V : never }[number],\n | { [K in keyof T]: T[K] extends Result<unknown, infer E, unknown> | Promise<Result<unknown, infer E, unknown>> ? E : never }[number]\n | EmptyInputError\n | PromiseRejectedError,\n | { [K in keyof T]: T[K] extends Result<unknown, unknown, infer C> | Promise<Result<unknown, unknown, infer C>> ? C : never }[number]\n | PromiseRejectionCause\n >\n> {\n if (results.length === 0) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return err({ type: \"EMPTY_INPUT\", message: \"anyAsync() requires at least one Result\" }) as any;\n }\n\n return new Promise((resolve) => {\n let settled = false;\n let pendingCount = results.length;\n let firstError: Err<unknown, unknown> | null = null;\n\n for (const item of results) {\n Promise.resolve(item)\n .catch((reason) =>\n err(\n { type: PROMISE_REJECTED, cause: reason } as PromiseRejectedError,\n { cause: { type: \"PROMISE_REJECTION\", reason } as PromiseRejectionCause }\n )\n )\n .then((result) => {\n if (settled) return;\n\n if (result.ok) {\n settled = true;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n resolve(result as any);\n return;\n }\n\n if (!firstError) firstError = result;\n pendingCount--;\n\n if (pendingCount === 0) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n resolve(firstError as any);\n }\n });\n }\n });\n}\n\n/**\n * Combines exactly two Results into a tuple.\n */\nexport function zip<A, EA, CA, B, EB, CB>(\n a: Result<A, EA, CA>,\n b: Result<B, EB, CB>\n): Result<[A, B], EA | EB, CA | CB> {\n if (!a.ok) return a;\n if (!b.ok) return b;\n return ok([a.value, b.value]);\n}\n\n/**\n * Async version of zip.\n */\nexport async function zipAsync<A, EA, CA, B, EB, CB>(\n a: Result<A, EA, CA> | Promise<Result<A, EA, CA>>,\n b: Result<B, EB, CB> | Promise<Result<B, EB, CB>>\n): Promise<Result<[A, B], EA | EB | PromiseRejectedError, CA | CB | PromiseRejectionCause>> {\n // Wrap rejections into PromiseRejectedError (consistent with allAsync)\n const wrapRejection = <T, E, C>(\n p: Result<T, E, C> | Promise<Result<T, E, C>>\n ): Promise<Result<T, E | PromiseRejectedError, C | PromiseRejectionCause>> =>\n Promise.resolve(p).catch((reason) =>\n err(\n { type: PROMISE_REJECTED, cause: reason } as PromiseRejectedError,\n { cause: { type: \"PROMISE_REJECTION\", reason } as PromiseRejectionCause }\n )\n );\n\n const [ra, rb] = await Promise.all([wrapRejection(a), wrapRejection(b)]);\n return zip(ra, rb);\n}\n\n// =============================================================================\n// Flatten\n// =============================================================================\n\n/**\n * Flattens a nested Result into a single Result.\n *\n * @remarks When to use: Unwrap a Result<Result<T, E1>, E2> into Result<T, E1 | E2> after an operation that returns nested Results.\n */\nexport function flatten<T, E1, C1, E2, C2>(\n result: Result<Result<T, E1, C1>, E2, C2>\n): Result<T, E1 | E2, C1 | C2> {\n if (!result.ok) return result as Err<E2, C2>;\n return result.value;\n}\n\n// =============================================================================\n// Deserialization (improved hydrate)\n// =============================================================================\n\n/** Discriminant for deserialization errors */\nexport const DESERIALIZATION_ERROR = \"DESERIALIZATION_ERROR\" as const;\n\n/** Error type returned when deserialize() receives invalid input */\nexport type DeserializationError = { type: typeof DESERIALIZATION_ERROR; value: unknown };\n\n/**\n * Deserialize a value back into a Result.\n * Returns a typed DeserializationError on invalid input instead of null.\n *\n * @remarks When to use: Rehydrate Results from JSON, RPC, or server actions with type-safe error handling.\n */\nexport function deserialize<T, E, C = unknown>(\n value: unknown\n): Result<T, E | DeserializationError, C> {\n if (typeof value !== \"object\" || value === null) {\n return err({ type: DESERIALIZATION_ERROR, value } as DeserializationError);\n }\n if (!(\"ok\" in value)) {\n return err({ type: DESERIALIZATION_ERROR, value } as DeserializationError);\n }\n\n const obj = value as Record<string, unknown>;\n if (obj.ok === true && \"value\" in obj) {\n return ok(obj.value as T);\n }\n if (obj.ok === false && \"error\" in obj) {\n return err(obj.error as E, { cause: obj.cause as C });\n }\n return err({ type: DESERIALIZATION_ERROR, value } as DeserializationError);\n}\n\n// =============================================================================\n// Serialization\n// =============================================================================\n\n/** A plain serialized form of a Result, safe to JSON.stringify. */\nexport type SerializedResult<T, E> = { ok: true; value: T } | { ok: false; error: E };\n\n/**\n * Serialize a Result to a plain object (inverse of `deserialize`).\n * Strips cause — safe for JSON.stringify, RPC, and server actions.\n *\n * @remarks When to use: Sending Results over the wire or storing them in JSON.\n */\nexport function serialize<T, E>(result: Result<T, E>): SerializedResult<T, E> {\n return result.ok\n ? { ok: true, value: result.value }\n : { ok: false, error: result.error };\n}\n\n// =============================================================================\n// Partial error matching\n// =============================================================================\n\n/**\n * Non-exhaustive error match — handle the errors you care about; let the rest fall through to fallback.\n *\n * @example\n * ```typescript\n * const message = matchErrorPartial(\n * error,\n * { NOT_FOUND: () => 'Resource not found' },\n * (e) => `Unexpected: ${e}`\n * );\n * ```\n */\nexport function matchErrorPartial<E extends string, R>(\n error: E | UnexpectedError,\n handlers: Partial<MatchErrorHandlers<E, R>>,\n fallback: (error: E | UnexpectedError) => R\n): R {\n if (isUnexpectedError(error)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const h = (handlers as any).UNEXPECTED_ERROR as ((e: UnexpectedError) => R) | undefined;\n return h ? h(error) : fallback(error);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const h = (handlers as any)[error as string] as ((e: E) => R) | undefined;\n return h ? h(error as E) : fallback(error);\n}\n\n// Retry helper is intentionally NOT re-exported here.\n// Import from the dedicated subpath to keep awaitly/result minimal:\n// import { tryAsyncRetry } from 'awaitly/result/retry';\n","/**\n * awaitly/functional\n *\n * Effect-inspired functional utilities for Result types.\n * Provides pipe-based composition with automatic error short-circuiting.\n */\n\nimport type { Result, AsyncResult, PromiseRejectedError, PromiseRejectionCause } from \"../result\";\nimport { ok, err, isOk, isErr, PROMISE_REJECTED } from \"../result\";\n\n// =============================================================================\n// Composition\n// =============================================================================\n\n/**\n * Pipe a value through a series of functions left-to-right.\n *\n * @example\n * ```typescript\n * const result = pipe(\n * 5,\n * (x) => x * 2,\n * (x) => x + 1\n * ); // 11\n * ```\n */\nexport function pipe<A>(a: A): A;\nexport function pipe<A, B>(a: A, ab: (a: A) => B): B;\nexport function pipe<A, B, C>(a: A, ab: (a: A) => B, bc: (b: B) => C): C;\nexport function pipe<A, B, C, D>(a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D): D;\nexport function pipe<A, B, C, D, E>(\n a: 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 a: 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 a: 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 a: 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 a: 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;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function pipe(a: unknown, ...fns: Array<(x: any) => any>): unknown {\n return fns.reduce((acc, fn) => fn(acc), a);\n}\n\n/**\n * Compose functions left-to-right (returns a function).\n *\n * @example\n * ```typescript\n * const double = (x: number) => x * 2;\n * const addOne = (x: number) => x + 1;\n * const transform = flow(double, addOne);\n * transform(5); // 11\n * ```\n */\nexport function flow<A, B>(ab: (a: A) => B): (a: A) => B;\nexport function flow<A, B, C>(ab: (a: A) => B, bc: (b: B) => C): (a: A) => C;\nexport function flow<A, B, C, D>(ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D): (a: A) => D;\nexport function flow<A, 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, 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, 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, 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, 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;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function flow(...fns: Array<(x: any) => any>): (a: unknown) => unknown {\n return (a: unknown) => fns.reduce((acc, fn) => fn(acc), a);\n}\n\n/**\n * Compose functions right-to-left.\n *\n * @example\n * ```typescript\n * const double = (x: number) => x * 2;\n * const addOne = (x: number) => x + 1;\n * const transform = compose(addOne, double);\n * transform(5); // 11 (double first, then addOne)\n * ```\n */\nexport function compose<A, B>(ab: (a: A) => B): (a: A) => B;\nexport function compose<A, B, C>(bc: (b: B) => C, ab: (a: A) => B): (a: A) => C;\nexport function compose<A, B, C, D>(cd: (c: C) => D, bc: (b: B) => C, ab: (a: A) => B): (a: A) => D;\nexport function compose<A, B, C, D, E>(\n de: (d: D) => E,\n cd: (c: C) => D,\n bc: (b: B) => C,\n ab: (a: A) => B\n): (a: A) => E;\nexport function compose<A, B, C, D, E, F>(\n ef: (e: E) => F,\n de: (d: D) => E,\n cd: (c: C) => D,\n bc: (b: B) => C,\n ab: (a: A) => B\n): (a: A) => F;\nexport function compose<A, B, C, D, E, F, G>(\n fg: (f: F) => G,\n ef: (e: E) => F,\n de: (d: D) => E,\n cd: (c: C) => D,\n bc: (b: B) => C,\n ab: (a: A) => B\n): (a: A) => G;\nexport function compose<A, B, C, D, E, F, G, H>(\n gh: (g: G) => H,\n fg: (f: F) => G,\n ef: (e: E) => F,\n de: (d: D) => E,\n cd: (c: C) => D,\n bc: (b: B) => C,\n ab: (a: A) => B\n): (a: A) => H;\nexport function compose<A, B, C, D, E, F, G, H, I>(\n hi: (h: H) => I,\n gh: (g: G) => H,\n fg: (f: F) => G,\n ef: (e: E) => F,\n de: (d: D) => E,\n cd: (c: C) => D,\n bc: (b: B) => C,\n ab: (a: A) => B\n): (a: A) => I;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function compose(...fns: Array<(x: any) => any>): (a: unknown) => unknown {\n return (a: unknown) => fns.reduceRight((acc, fn) => fn(acc), a);\n}\n\n/**\n * Identity function - returns its argument unchanged.\n *\n * @example\n * ```typescript\n * identity(42); // 42\n * ```\n */\nexport const identity = <A>(a: A): A => a;\n\n// =============================================================================\n// Result Combinators (sync)\n// =============================================================================\n\n/**\n * Transform the success value of a Result.\n *\n * @example\n * ```typescript\n * const result = Awaitly.ok(5);\n * map(result, (x) => x * 2); // Awaitly.ok(10)\n *\n * const error = Awaitly.err(\"not found\");\n * map(error, (x) => x * 2); // Awaitly.err(\"not found\")\n * ```\n */\nexport function map<T, U, E, C>(result: Result<T, E, C>, fn: (value: T) => U): Result<U, E, C> {\n if (isOk(result)) {\n return ok(fn(result.value));\n }\n return result as Result<U, E, C>;\n}\n\n/**\n * Transform and flatten (short-circuits on error).\n *\n * @example\n * ```typescript\n * const divide = (a: number, b: number): Result<number, string> =>\n * b === 0 ? Awaitly.err(\"division by zero\") : Awaitly.ok(a / b);\n *\n * const result = Awaitly.ok(10);\n * flatMap(result, (x) => divide(x, 2)); // Awaitly.ok(5)\n * flatMap(result, (x) => divide(x, 0)); // Awaitly.err(\"division by zero\")\n * ```\n */\nexport function flatMap<T, U, E1, E2, C1, C2>(\n result: Result<T, E1, C1>,\n fn: (value: T) => Result<U, E2, C2>\n): Result<U, E1 | E2, C1 | C2> {\n if (isOk(result)) {\n return fn(result.value);\n }\n return result as Result<U, E1 | E2, C1 | C2>;\n}\n\n/**\n * Transform both success and error values.\n *\n * @example\n * ```typescript\n * const result = Awaitly.ok(5);\n * bimap(result, (x) => x * 2, (e) => `Error: ${e}`); // Awaitly.ok(10)\n *\n * const error = Awaitly.err(\"not found\");\n * bimap(error, (x) => x * 2, (e) => `Error: ${e}`); // Awaitly.err(\"Error: not found\")\n * ```\n */\nexport function bimap<T, U, E1, E2, C>(\n result: Result<T, E1, C>,\n onOk: (value: T) => U,\n onErr: (error: E1) => E2\n): Result<U, E2, C> {\n if (isOk(result)) {\n return ok(onOk(result.value));\n }\n return err(onErr(result.error), { cause: result.cause }) as Result<U, E2, C>;\n}\n\n/**\n * Transform the error value.\n *\n * @example\n * ```typescript\n * const error = Awaitly.err(\"not found\");\n * mapError(error, (e) => ({ type: \"ERROR\", message: e }));\n * // Awaitly.err({ type: \"ERROR\", message: \"not found\" })\n * ```\n */\nexport function mapError<T, E1, E2, C>(\n result: Result<T, E1, C>,\n fn: (error: E1) => E2\n): Result<T, E2, C> {\n if (isErr(result)) {\n return err(fn(result.error), { cause: result.cause }) as Result<T, E2, C>;\n }\n return result as Result<T, E2, C>;\n}\n\n/**\n * Side effect on success (returns original result).\n *\n * @example\n * ```typescript\n * const result = Awaitly.ok(5);\n * tap(result, (x) => console.log(`Value: ${x}`)); // logs \"Value: 5\", returns Awaitly.ok(5)\n * ```\n */\nexport function tap<T, E, C>(result: Result<T, E, C>, fn: (value: T) => void): Result<T, E, C> {\n if (isOk(result)) {\n fn(result.value);\n }\n return result;\n}\n\n/**\n * Side effect on error (returns original result).\n *\n * @example\n * ```typescript\n * const error = Awaitly.err(\"not found\");\n * tapError(error, (e) => console.log(`Error: ${e}`)); // logs \"Error: not found\", returns err\n * ```\n */\nexport function tapError<T, E, C>(result: Result<T, E, C>, fn: (error: E) => void): Result<T, E, C> {\n if (isErr(result)) {\n fn(result.error);\n }\n return result;\n}\n\n/**\n * Pattern match on Result.\n *\n * @example\n * ```typescript\n * const result = Awaitly.ok(5);\n * match(result, {\n * ok: (x) => `Success: ${x}`,\n * err: (e) => `Error: ${e}`\n * }); // \"Success: 5\"\n * ```\n */\nexport function match<T, E, U, C>(\n result: Result<T, E, C>,\n patterns: { ok: (value: T) => U; err: (error: E, cause?: C) => U }\n): U {\n if (isOk(result)) {\n return patterns.ok(result.value);\n }\n return patterns.err(result.error, result.cause);\n}\n\n/**\n * Recover from error by providing fallback value.\n *\n * @example\n * ```typescript\n * const error = Awaitly.err(\"not found\");\n * recover(error, () => 0); // 0\n *\n * const success = Awaitly.ok(5);\n * recover(success, () => 0); // 5\n * ```\n */\nexport function recover<T, E, C>(result: Result<T, E, C>, fn: (error: E) => T): T {\n if (isOk(result)) {\n return result.value;\n }\n return fn(result.error);\n}\n\n/**\n * Recover from error with another Result.\n *\n * @example\n * ```typescript\n * const error = Awaitly.err(\"not found\");\n * recoverWith(error, (e) => ok(0)); // ok(0)\n * recoverWith(error, (e) => err(\"still failed\")); // err(\"still failed\")\n * ```\n */\nexport function recoverWith<T, E1, E2, C1, C2>(\n result: Result<T, E1, C1>,\n fn: (error: E1) => Result<T, E2, C2>\n): Result<T, E2, C1 | C2> {\n if (isOk(result)) {\n return result as Result<T, E2, C1 | C2>;\n }\n return fn(result.error);\n}\n\n/**\n * Get the value or a default.\n *\n * @example\n * ```typescript\n * const error = Awaitly.err(\"not found\");\n * getOrElse(error, 0); // 0\n *\n * const success = Awaitly.ok(5);\n * getOrElse(success, 0); // 5\n * ```\n */\nexport function getOrElse<T, E, C>(result: Result<T, E, C>, defaultValue: T): T {\n if (isOk(result)) {\n return result.value;\n }\n return defaultValue;\n}\n\n/**\n * Get the value or compute a default lazily.\n *\n * @example\n * ```typescript\n * const error = Awaitly.err(\"not found\");\n * getOrElseLazy(error, () => expensiveComputation()); // calls expensiveComputation()\n *\n * const success = Awaitly.ok(5);\n * getOrElseLazy(success, () => expensiveComputation()); // 5, doesn't call expensiveComputation\n * ```\n */\nexport function getOrElseLazy<T, E, C>(result: Result<T, E, C>, fn: () => T): T {\n if (isOk(result)) {\n return result.value;\n }\n return fn();\n}\n\n// =============================================================================\n// Result Combinators (async)\n// =============================================================================\n\n/**\n * Transform success value asynchronously.\n *\n * @example\n * ```typescript\n * const result = Awaitly.ok(5);\n * await mapAsync(result, async (x) => x * 2); // ok(10)\n * ```\n */\nexport async function mapAsync<T, U, E, C>(\n result: Result<T, E, C> | AsyncResult<T, E, C>,\n fn: (value: T) => Promise<U>\n): AsyncResult<U, E, C> {\n const resolved = await result;\n if (isOk(resolved)) {\n return ok(await fn(resolved.value));\n }\n return resolved as Result<U, E, C>;\n}\n\n/**\n * Async flatMap.\n *\n * @example\n * ```typescript\n * const fetchUser = async (id: string): AsyncResult<User, \"NOT_FOUND\"> => { ... };\n * const result = Awaitly.ok(\"user-123\");\n * await flatMapAsync(result, fetchUser); // AsyncResult<User, \"NOT_FOUND\">\n * ```\n */\nexport async function flatMapAsync<T, U, E1, E2, C1, C2>(\n result: Result<T, E1, C1> | AsyncResult<T, E1, C1>,\n fn: (value: T) => AsyncResult<U, E2, C2>\n): AsyncResult<U, E1 | E2, C1 | C2> {\n const resolved = await result;\n if (isOk(resolved)) {\n return fn(resolved.value);\n }\n return resolved as Result<U, E1 | E2, C1 | C2>;\n}\n\n/**\n * Async tap - side effect on success.\n *\n * @example\n * ```typescript\n * const result = Awaitly.ok(5);\n * await tapAsync(result, async (x) => {\n * await logToServer(x);\n * }); // ok(5)\n * ```\n */\nexport async function tapAsync<T, E, C>(\n result: Result<T, E, C> | AsyncResult<T, E, C>,\n fn: (value: T) => Promise<void>\n): AsyncResult<T, E, C> {\n const resolved = await result;\n if (isOk(resolved)) {\n await fn(resolved.value);\n }\n return resolved;\n}\n\n/**\n * Async tapError - side effect on error.\n *\n * @example\n * ```typescript\n * const error = Awaitly.err(\"not found\");\n * await tapErrorAsync(error, async (e) => {\n * await logErrorToServer(e);\n * }); // err(\"not found\")\n * ```\n */\nexport async function tapErrorAsync<T, E, C>(\n result: Result<T, E, C> | AsyncResult<T, E, C>,\n fn: (error: E) => Promise<void>\n): AsyncResult<T, E, C> {\n const resolved = await result;\n if (isErr(resolved)) {\n await fn(resolved.error);\n }\n return resolved;\n}\n\n// =============================================================================\n// Collection Utilities (Result-aware)\n// =============================================================================\n\n/**\n * Combine array of Results - fails fast on first error.\n *\n * @example\n * ```typescript\n * all([ok(1), ok(2), ok(3)]); // ok([1, 2, 3])\n * all([ok(1), err(\"fail\"), ok(3)]); // err(\"fail\")\n * ```\n */\nexport function all<T, E, C>(results: Result<T, E, C>[]): Result<T[], E, C> {\n const values: T[] = [];\n for (const result of results) {\n if (isErr(result)) {\n return result as Result<T[], E, C>;\n }\n values.push(result.value);\n }\n return ok(values);\n}\n\n/**\n * Combine array of AsyncResults - parallel execution, fails fast.\n *\n * Returns immediately when any result fails, without waiting for\n * pending promises. Only returns all values if every result succeeds.\n *\n * @example\n * ```typescript\n * await allAsync([\n * fetchUser(\"1\"),\n * fetchUser(\"2\"),\n * fetchUser(\"3\")\n * ]); // AsyncResult<User[], \"NOT_FOUND\">\n * ```\n */\nexport async function allAsync<T, E, C>(\n results: AsyncResult<T, E, C>[]\n): AsyncResult<T[], E | PromiseRejectedError, C | PromiseRejectionCause> {\n if (results.length === 0) {\n return ok([]);\n }\n\n const values: T[] = new Array(results.length);\n let settledCount = 0;\n let done = false;\n\n return new Promise((resolve) => {\n results.forEach((resultPromise, index) => {\n resultPromise.then(\n (result) => {\n if (done) return;\n if (isErr(result)) {\n done = true;\n resolve(result as Result<T[], E | PromiseRejectedError, C | PromiseRejectionCause>);\n } else {\n values[index] = result.value;\n settledCount++;\n if (settledCount === results.length) {\n done = true;\n resolve(ok(values));\n }\n }\n },\n (reason) => {\n if (done) return;\n done = true;\n resolve(\n err(\n { type: PROMISE_REJECTED, cause: reason } as PromiseRejectedError,\n { cause: { type: \"PROMISE_REJECTION\" as const, reason } as PromiseRejectionCause }\n )\n );\n }\n );\n });\n });\n}\n\n/**\n * Collect all results, separating successes and failures.\n *\n * @example\n * ```typescript\n * allSettled([ok(1), err(\"a\"), ok(2), err(\"b\")]);\n * // { ok: [1, 2], err: [\"a\", \"b\"] }\n * ```\n */\nexport function allSettled<T, E, C>(results: Result<T, E, C>[]): { ok: T[]; err: E[] } {\n const okValues: T[] = [];\n const errValues: E[] = [];\n for (const result of results) {\n if (isOk(result)) {\n okValues.push(result.value);\n } else {\n errValues.push(result.error);\n }\n }\n return { ok: okValues, err: errValues };\n}\n\n/**\n * Async version of allSettled.\n *\n * Handles rejected promises by treating them as errors with\n * type PROMISE_REJECTED.\n *\n * @example\n * ```typescript\n * await allSettledAsync([\n * fetchUser(\"1\"),\n * fetchUser(\"2\"),\n * fetchUser(\"3\")\n * ]); // { ok: [...users], err: [...errors] }\n * ```\n */\nexport async function allSettledAsync<T, E, C>(\n results: AsyncResult<T, E, C>[]\n): Promise<{ ok: T[]; err: (E | PromiseRejectedError)[] }> {\n if (results.length === 0) {\n return { ok: [], err: [] };\n }\n\n type Settled = { type: \"ok\"; value: T } | { type: \"err\"; error: E | PromiseRejectedError };\n const settled: Settled[] = new Array(results.length);\n let settledCount = 0;\n\n return new Promise((resolve) => {\n results.forEach((resultPromise, index) => {\n resultPromise.then(\n (result) => {\n if (isOk(result)) {\n settled[index] = { type: \"ok\", value: result.value };\n } else {\n settled[index] = { type: \"err\", error: result.error };\n }\n settledCount++;\n if (settledCount === results.length) {\n const okValues: T[] = [];\n const errValues: (E | PromiseRejectedError)[] = [];\n for (const s of settled) {\n if (s.type === \"ok\") {\n okValues.push(s.value);\n } else {\n errValues.push(s.error);\n }\n }\n resolve({ ok: okValues, err: errValues });\n }\n },\n (reason) => {\n settled[index] = { type: \"err\", error: { type: PROMISE_REJECTED, cause: reason } as PromiseRejectedError };\n settledCount++;\n if (settledCount === results.length) {\n const okValues: T[] = [];\n const errValues: (E | PromiseRejectedError)[] = [];\n for (const s of settled) {\n if (s.type === \"ok\") {\n okValues.push(s.value);\n } else {\n errValues.push(s.error);\n }\n }\n resolve({ ok: okValues, err: errValues });\n }\n }\n );\n });\n });\n}\n\n/**\n * Return first success, or all errors if all fail.\n *\n * @example\n * ```typescript\n * any([err(\"a\"), ok(1), err(\"b\")]); // ok(1)\n * any([err(\"a\"), err(\"b\"), err(\"c\")]); // err([\"a\", \"b\", \"c\"])\n * ```\n */\nexport function any<T, E, C>(results: Result<T, E, C>[]): Result<T, E[], C> {\n const errors: E[] = [];\n for (const result of results) {\n if (isOk(result)) {\n return result as Result<T, E[], C>;\n }\n errors.push(result.error);\n }\n return err(errors);\n}\n\n/**\n * Async version of any - returns first success immediately.\n *\n * Returns as soon as any result succeeds, without waiting for\n * pending promises. Only returns all errors if every result fails.\n *\n * @example\n * ```typescript\n * await anyAsync([\n * fetchFromCache(key),\n * fetchFromDb(key),\n * fetchFromApi(key)\n * ]); // First successful result\n * ```\n */\nexport async function anyAsync<T, E, C>(\n results: AsyncResult<T, E, C>[]\n): AsyncResult<T, (E | PromiseRejectedError)[], C | PromiseRejectionCause> {\n if (results.length === 0) {\n return err([]);\n }\n\n const errors: (E | PromiseRejectedError | undefined)[] = new Array(results.length);\n let settledCount = 0;\n let done = false;\n\n return new Promise((resolve) => {\n results.forEach((resultPromise, index) => {\n resultPromise.then(\n (result) => {\n if (done) return;\n if (isOk(result)) {\n done = true;\n resolve(result as Result<T, (E | PromiseRejectedError)[], C | PromiseRejectionCause>);\n } else {\n errors[index] = result.error;\n settledCount++;\n if (settledCount === results.length) {\n done = true;\n resolve(err(errors.filter((e): e is E | PromiseRejectedError => e !== undefined)));\n }\n }\n },\n (reason) => {\n if (done) return;\n errors[index] = { type: PROMISE_REJECTED, cause: reason } as PromiseRejectedError;\n settledCount++;\n if (settledCount === results.length) {\n done = true;\n resolve(err(errors.filter((e): e is E | PromiseRejectedError => e !== undefined)));\n }\n }\n );\n });\n });\n}\n\n/**\n * Race async results - first to complete wins.\n *\n * Handles rejected promises by converting them to err() results\n * with type PROMISE_REJECTED.\n *\n * @example\n * ```typescript\n * await race([\n * fetchFromPrimaryServer(id),\n * fetchFromBackupServer(id)\n * ]); // Result from whichever server responds first\n * ```\n */\nexport async function race<T, E, C>(\n results: AsyncResult<T, E, C>[]\n): AsyncResult<T, E | PromiseRejectedError, C | PromiseRejectionCause> {\n return Promise.race(\n results.map((p) =>\n p.catch(\n (reason) =>\n err(\n { type: PROMISE_REJECTED, cause: reason } as PromiseRejectedError,\n { cause: { type: \"PROMISE_REJECTION\" as const, reason } as PromiseRejectionCause }\n ) as Result<T, E | PromiseRejectedError, C | PromiseRejectionCause>\n )\n )\n );\n}\n\n/**\n * Sequence an array through a Result-returning function.\n * Stops on first error.\n *\n * @example\n * ```typescript\n * const validate = (x: number): Result<number, string> =>\n * x > 0 ? ok(x) : err(\"must be positive\");\n *\n * traverse([1, 2, 3], validate); // ok([1, 2, 3])\n * traverse([1, -2, 3], validate); // err(\"must be positive\")\n * ```\n */\nexport function traverse<T, U, E, C>(\n items: T[],\n fn: (item: T, index: number) => Result<U, E, C>\n): Result<U[], E, C> {\n const results: U[] = [];\n for (let i = 0; i < items.length; i++) {\n const result = fn(items[i]!, i);\n if (isErr(result)) {\n return result as Result<U[], E, C>;\n }\n results.push(result.value);\n }\n return ok(results);\n}\n\n/**\n * Async version of traverse.\n *\n * @example\n * ```typescript\n * await traverseAsync(userIds, async (id) => fetchUser(id));\n * ```\n */\nexport async function traverseAsync<T, U, E, C>(\n items: T[],\n fn: (item: T, index: number) => AsyncResult<U, E, C>\n): AsyncResult<U[], E, C> {\n const results: U[] = [];\n for (let i = 0; i < items.length; i++) {\n const result = await fn(items[i]!, i);\n if (isErr(result)) {\n return result as Result<U[], E, C>;\n }\n results.push(result.value);\n }\n return ok(results);\n}\n\n/**\n * Parallel traverse - executes all in parallel, fails fast.\n *\n * Returns immediately when any result fails, without waiting for\n * pending operations. Only returns all values if every result succeeds.\n *\n * @example\n * ```typescript\n * await traverseParallel(userIds, fetchUser);\n * ```\n */\nexport async function traverseParallel<T, U, E, C>(\n items: T[],\n fn: (item: T, index: number) => AsyncResult<U, E, C>\n): AsyncResult<U[], E | PromiseRejectedError, C | PromiseRejectionCause> {\n return allAsync(items.map((item, index) => fn(item, index)));\n}\n\n// =============================================================================\n// Pipeable Result Functions (R namespace)\n// =============================================================================\n\n/**\n * Curried Result combinators for use in pipe().\n *\n * @example\n * ```typescript\n * import { pipe, R } from 'awaitly/functional';\n *\n * const result = pipe(\n * fetchUser(id),\n * R.flatMap(user => fetchPosts(user.id)),\n * R.map(posts => posts.filter(p => p.published)),\n * R.tap(posts => console.log(`Found ${posts.length} posts`)),\n * R.match({\n * ok: posts => `Found ${posts.length} posts`,\n * err: error => `Failed: ${error}`\n * })\n * );\n * ```\n */\nexport const R = {\n /** Curried map for use in pipe() */\n map:\n <T, U, E, C>(fn: (value: T) => U) =>\n (result: Result<T, E, C>): Result<U, E, C> =>\n map(result, fn),\n\n /** Curried flatMap for use in pipe() */\n flatMap:\n <T, U, E1, E2, C1, C2>(fn: (value: T) => Result<U, E2, C2>) =>\n (result: Result<T, E1, C1>): Result<U, E1 | E2, C1 | C2> =>\n flatMap(result, fn),\n\n /** Curried bimap for use in pipe() */\n bimap:\n <T, U, E1, E2, C>(onOk: (value: T) => U, onErr: (error: E1) => E2) =>\n (result: Result<T, E1, C>): Result<U, E2, C> =>\n bimap(result, onOk, onErr),\n\n /** Curried mapError for use in pipe() */\n mapError:\n <T, E1, E2, C>(fn: (error: E1) => E2) =>\n (result: Result<T, E1, C>): Result<T, E2, C> =>\n mapError(result, fn),\n\n /** Curried tap for use in pipe() */\n tap:\n <T, E, C>(fn: (value: T) => void) =>\n (result: Result<T, E, C>): Result<T, E, C> =>\n tap(result, fn),\n\n /** Curried tapError for use in pipe() */\n tapError:\n <T, E, C>(fn: (error: E) => void) =>\n (result: Result<T, E, C>): Result<T, E, C> =>\n tapError(result, fn),\n\n /** Curried match for use in pipe() */\n match:\n <T, E, U, C>(patterns: { ok: (value: T) => U; err: (error: E, cause?: C) => U }) =>\n (result: Result<T, E, C>): U =>\n match(result, patterns),\n\n /** Curried recover for use in pipe() */\n recover:\n <T, E, C>(fn: (error: E) => T) =>\n (result: Result<T, E, C>): T =>\n recover(result, fn),\n\n /** Curried recoverWith for use in pipe() */\n recoverWith:\n <T, E1, E2, C1, C2>(fn: (error: E1) => Result<T, E2, C2>) =>\n (result: Result<T, E1, C1>): Result<T, E2, C1 | C2> =>\n recoverWith(result, fn),\n\n /** Curried getOrElse for use in pipe() */\n getOrElse:\n <T, E, C>(defaultValue: T) =>\n (result: Result<T, E, C>): T =>\n getOrElse(result, defaultValue),\n\n /** Curried getOrElseLazy for use in pipe() */\n getOrElseLazy:\n <T, E, C>(fn: () => T) =>\n (result: Result<T, E, C>): T =>\n getOrElseLazy(result, fn),\n};\n"],"mappings":"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","names":["PROMISE_REJECTED","ok","value","err","error","options","cause","isOk","r","isErr","pipe","a","fns","acc","fn","flow","compose","identity","map","result","isOk","ok","flatMap","bimap","onOk","onErr","err","mapError","isErr","tap","tapError","match","patterns","recover","recoverWith","getOrElse","defaultValue","getOrElseLazy","mapAsync","resolved","flatMapAsync","tapAsync","tapErrorAsync","all","results","values","allAsync","settledCount","done","resolve","resultPromise","index","reason","PROMISE_REJECTED","allSettled","okValues","errValues","allSettledAsync","settled","s","any","errors","anyAsync","e","race","p","traverse","items","i","traverseAsync","traverseParallel","item","R"]}
1
+ {"version":3,"sources":["../src/result/index.ts","../src/functional/index.ts"],"sourcesContent":["/**\n * awaitly/result (internal)\n *\n * Core Result primitives - minimal bundle for typed error handling.\n * This file is intentionally kept small for optimal tree-shaking.\n * The full orchestration (run, step, etc.) lives in core.ts.\n */\n\n// =============================================================================\n// Core Result Types\n// =============================================================================\n\n/**\n * Represents a successful result.\n * Use `ok(value)` to create instances.\n */\nexport type Ok<T> = {\n ok: true;\n value: T;\n};\n\n/**\n * Represents a failed result.\n * Use `err(error)` to create instances.\n */\nexport type Err<E, C = unknown> = {\n ok: false;\n error: E;\n cause?: C;\n};\n\n/**\n * Represents a successful computation or a failed one.\n */\nexport type Result<T, E = unknown, C = unknown> = Ok<T> | Err<E, C>;\n\n/**\n * A Promise that resolves to a Result.\n */\nexport type AsyncResult<T, E = unknown, C = unknown> = Promise<Result<T, E, C>>;\n\n/** Discriminant for PromiseRejectedError type - use in switch statements */\nexport const PROMISE_REJECTED = \"PROMISE_REJECTED\" as const;\n\n// =============================================================================\n// Named Error Constants (for static analysis)\n// =============================================================================\n\n/**\n * Named error constant for unexpected/unhandled errors.\n * Used by the analyzer when a step doesn't declare errors.\n */\nexport const AWAITLY_UNEXPECTED = \"AWAITLY_UNEXPECTED\" as const;\n\n/**\n * Named error constant for cancelled operations.\n */\nexport const AWAITLY_CANCELLED = \"AWAITLY_CANCELLED\" as const;\n\n/**\n * Named error constant for timed-out operations.\n */\nexport const AWAITLY_TIMEOUT = \"AWAITLY_TIMEOUT\" as const;\n\n// =============================================================================\n// Static Analysis Helpers\n// =============================================================================\n\n/**\n * Helper to create a tuple of string literal tags with preserved literal types.\n * Use this when you need to store error tags in a variable while keeping\n * TypeScript's literal type inference (avoiding widening to string[]).\n *\n * @param t - The string literal tags\n * @returns The same array with preserved literal types\n *\n * @example\n * ```typescript\n * // Without tags() - type widens to string[]\n * const errs = ['CART_NOT_FOUND', 'CART_EMPTY']; // string[]\n *\n * // With tags() - literal types preserved\n * const errs = tags('CART_NOT_FOUND', 'CART_EMPTY'); // readonly ['CART_NOT_FOUND', 'CART_EMPTY']\n *\n * await step('getCart', () => getCart(id), {\n * errors: errs, // Analyzer can extract literal types\n * out: 'cart',\n * });\n * ```\n */\nexport const tags = <const T extends readonly string[]>(...t: T): T => t;\n\nimport { UnexpectedError } from \"../errors\";\nexport { UnexpectedError };\nexport type PromiseRejectedError = { type: typeof PROMISE_REJECTED; cause: unknown };\n/** Cause type for promise rejections in async batch helpers */\nexport type PromiseRejectionCause = { type: \"PROMISE_REJECTION\"; reason: unknown };\nexport type EmptyInputError = { type: \"EMPTY_INPUT\"; message: string };\nexport type MaybeAsyncResult<T, E, C = unknown> = Result<T, E, C> | Promise<Result<T, E, C>>;\n\n// =============================================================================\n// Result Constructors\n// =============================================================================\n\n/**\n * Creates a successful Result.\n *\n * @remarks When to use: Wrap a successful value in a Result for consistent return types.\n */\nexport function ok(): Ok<void>;\nexport function ok<T>(value: T): Ok<T>;\nexport function ok<T>(value?: T): Ok<T | void> {\n return { ok: true as const, value: value as T | void };\n}\n\n/**\n * Creates a failed Result.\n *\n * @remarks When to use: Return a typed failure without throwing so callers can handle it explicitly.\n */\nexport function err<E, C = unknown>(error: E, options?: { cause?: C }): Err<E, C> {\n const cause = options?.cause;\n return { ok: false as const, error, ...(cause !== undefined ? { cause } : {}) } as Err<E, C>;\n}\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n/**\n * Checks if a Result is successful.\n *\n * @remarks When to use: Prefer functional-style checks or array filtering over `result.ok`.\n */\nexport const isOk = <T, E, C>(r: Result<T, E, C>): r is Ok<T> => r.ok;\n\n/**\n * Checks if a Result is a failure.\n *\n * @remarks When to use: Prefer functional-style checks or array filtering over `result.ok`.\n */\nexport const isErr = <T, E, C>(r: Result<T, E, C>): r is Err<E, C> => !r.ok;\n\n/**\n * Checks if an error is an UnexpectedError.\n *\n * @remarks When to use: Distinguish unexpected failures from your typed error union.\n */\nexport const isUnexpectedError = (e: unknown): e is UnexpectedError =>\n e instanceof UnexpectedError ||\n (typeof e === \"object\" &&\n e !== null &&\n \"_tag\" in e &&\n (e as { _tag: string })._tag === \"UnexpectedError\");\n\n/**\n * Checks if an error is a PromiseRejectedError.\n */\nexport const isPromiseRejectedError = (e: unknown): e is PromiseRejectedError =>\n typeof e === \"object\" &&\n e !== null &&\n \"type\" in e &&\n e.type === PROMISE_REJECTED;\n\n// =============================================================================\n// Error Matching\n// =============================================================================\n\nexport type MatchErrorHandlers<E extends string, R> = {\n [K in Exclude<E, \"UnexpectedError\">]: (error: K) => R;\n} & {\n UnexpectedError: (error: UnexpectedError) => R;\n};\n\n/**\n * Match on string error types with exhaustive checking.\n * Takes an error value (not a Result) and handlers for each error type.\n */\nexport function matchError<E extends string, R>(\n error: E | UnexpectedError,\n handlers: MatchErrorHandlers<E, R>\n): R {\n // Handle UnexpectedError instances\n if (isUnexpectedError(error)) {\n return handlers.UnexpectedError(error as UnexpectedError);\n }\n // Handle string literal errors\n type StringErrors = Exclude<E, \"UnexpectedError\">;\n return (handlers as unknown as Record<string, (e: string) => R>)[error as StringErrors](error as StringErrors);\n}\n\n// =============================================================================\n// Type Utilities\n// =============================================================================\n\ntype AnyFunction = (...args: never[]) => unknown;\n\n/**\n * Helper to extract the error type from Result or AsyncResult return values.\n * Works even when a function is declared to return a union of both forms.\n */\ntype ErrorOfReturn<R> = Extract<Awaited<R>, { ok: false }> extends { error: infer E }\n ? E\n : never;\n\n/**\n * Extract error type from a single function's return type\n */\nexport type ErrorOf<T extends AnyFunction> = ErrorOfReturn<ReturnType<T>>;\n\n/**\n * Extract union of error types from multiple functions\n */\nexport type Errors<T extends AnyFunction[]> = {\n [K in keyof T]: ErrorOf<T[K]>;\n}[number];\n\n/**\n * Extract value type from Result\n */\nexport type ExtractValue<T> = T extends { ok: true; value: infer U }\n ? U\n : never;\n\n/**\n * Extract error type from Result\n */\nexport type ExtractError<T> = T extends { ok: false; error: infer E }\n ? E\n : never;\n\n/**\n * Extract cause type from Result\n */\nexport type ExtractCause<T> = T extends { ok: false; cause?: infer C }\n ? C\n : never;\n\n/**\n * Helper to extract the cause type from Result or AsyncResult return values.\n * Works even when a function is declared to return a union of both forms.\n */\ntype CauseOfReturn<R> = Extract<Awaited<R>, { ok: false }> extends { cause?: infer C }\n ? C\n : never;\n\n/**\n * Extract cause type from a function's return type\n */\nexport type CauseOf<T extends AnyFunction> = CauseOfReturn<ReturnType<T>>;\n\n// =============================================================================\n// Unwrap Utilities\n// =============================================================================\n\n/**\n * Error thrown when attempting to unwrap an Err result.\n */\nexport class UnwrapError extends Error {\n public readonly error: unknown;\n public readonly cause?: unknown;\n\n constructor(result: Err<unknown, unknown>) {\n const errorStr =\n typeof result.error === \"string\"\n ? result.error\n : JSON.stringify(result.error);\n super(`Attempted to unwrap an Err: ${errorStr}`);\n this.name = \"UnwrapError\";\n this.error = result.error;\n this.cause = result.cause;\n }\n}\n\n/**\n * Extracts the value from an Ok result, or throws UnwrapError if it's an Err.\n *\n * @remarks When to use: Only at boundaries or tests where a failure should be fatal.\n */\nexport const unwrap = <T, E, C>(r: Result<T, E, C>): T => {\n if (r.ok) return r.value;\n throw new UnwrapError(r);\n};\n\n/**\n * Extracts the value from an Ok result, or returns a default value if it's an Err.\n *\n * @remarks When to use: Provide a safe fallback without branching.\n */\nexport const unwrapOr = <T, E, C>(r: Result<T, E, C>, defaultValue: T): T =>\n r.ok ? r.value : defaultValue;\n\n/**\n * Extracts the value from an Ok result, or calls a function to get a default value if it's an Err.\n *\n * @remarks When to use: Compute a fallback from the error (logging, metrics, or derived defaults).\n */\nexport const unwrapOrElse = <T, E, C>(\n r: Result<T, E, C>,\n fn: (error: E, cause?: C) => T\n): T => (r.ok ? r.value : fn(r.error, r.cause));\n\n/**\n * Alias for `unwrap`. Returns the success value or throws.\n *\n * The Result is already computed; use when you want the value or throw (e.g. at boundaries or in tests).\n *\n * @param r - The Result to unwrap\n * @returns The success value if the Result is successful\n * @throws {UnwrapError} If the Result is an error (includes the error and cause)\n */\nexport const runOrThrow = <T, E, C>(r: Result<T, E, C>): T => unwrap(r);\n\n/**\n * Awaits a Promise of a Result, then returns the success value or rejects.\n *\n * The returned promise **resolves with T** on success and **rejects with UnwrapError** on failure.\n * UnwrapError extends Error and carries the original `error` and `cause` from the Err.\n *\n * @param ar - A Promise or thenable that resolves to a Result\n * @returns A Promise that resolves with the success value or rejects with UnwrapError\n */\nexport const runOrThrowAsync = <T, E, C>(\n ar: PromiseLike<Result<T, E, C>>\n): Promise<T> => Promise.resolve(ar).then(unwrap);\n\n/**\n * Convenience alias for `unwrapOr(r, null)`. Returns the success value or null.\n *\n * @param r - The Result to unwrap\n * @returns The success value if successful, otherwise null\n */\nexport const runOrNull = <T, E, C>(r: Result<T, E, C>): T | null =>\n r.ok ? r.value : null;\n\n/**\n * Convenience alias for `unwrapOr(r, undefined)`. Returns the success value or undefined.\n *\n * @param r - The Result to unwrap\n * @returns The success value if successful, otherwise undefined\n */\nexport const runOrUndefined = <T, E, C>(r: Result<T, E, C>): T | undefined =>\n r.ok ? r.value : undefined;\n\n// =============================================================================\n// Wrapping Functions\n// =============================================================================\n\n/**\n * Wraps a synchronous function that might throw into a Result.\n *\n * @remarks When to use: Wrap sync code that might throw so exceptions become Err values.\n */\nexport function from<T>(fn: () => T): Ok<T> | Err<unknown, unknown>;\nexport function from<T, E>(fn: () => T, onError: (cause: unknown) => E): Ok<T> | Err<E, unknown>;\nexport function from<T, E>(fn: () => T, onError?: (cause: unknown) => E) {\n try {\n return ok(fn());\n } catch (cause) {\n return onError ? err(onError(cause), { cause }) : err(cause);\n }\n}\n\n/**\n * Wraps a Promise into a Result.\n *\n * @remarks When to use: Wrap a Promise and keep the raw rejection as Err; use tryAsync to map errors.\n */\nexport function fromPromise<T>(promise: Promise<T>): Promise<Ok<T> | Err<unknown, unknown>>;\nexport function fromPromise<T, E>(\n promise: Promise<T>,\n onError: (cause: unknown) => E\n): Promise<Ok<T> | Err<E, unknown>>;\nexport async function fromPromise<T, E>(\n promise: Promise<T>,\n onError?: (cause: unknown) => E\n): Promise<Ok<T> | Err<E | unknown, unknown>> {\n try {\n return ok(await promise);\n } catch (cause) {\n return onError ? err(onError(cause), { cause }) : err(cause);\n }\n}\n\n/**\n * Wraps an async function that might throw into an AsyncResult.\n *\n * @remarks When to use: Wrap async work and map thrown/rejected values into your typed error union.\n */\nexport function tryAsync<T>(fn: () => Promise<T>): AsyncResult<T, unknown>;\nexport function tryAsync<T, E>(\n fn: () => Promise<T>,\n onError: (cause: unknown) => E\n): AsyncResult<T, E>;\nexport async function tryAsync<T, E>(\n fn: () => Promise<T>,\n onError?: (cause: unknown) => E\n): AsyncResult<T, E | unknown> {\n try {\n return ok(await fn());\n } catch (cause) {\n return onError ? err(onError(cause), { cause }) : err(cause);\n }\n}\n\n/**\n * Converts a nullable value into a Result.\n *\n * @remarks When to use: Turn null/undefined into a typed error before continuing.\n */\nexport function fromNullable<T, E>(\n value: T | null | undefined,\n onNull: () => E\n): Result<T, E> {\n return value != null ? ok(value) : err(onNull());\n}\n\n// =============================================================================\n// Transformers\n// =============================================================================\n\n/**\n * Transforms the value inside an Ok result.\n *\n * @remarks When to use: Transform only the Ok value while leaving Err untouched.\n */\nexport function map<T, U>(r: Ok<T>, fn: (value: T) => U): Ok<U>;\nexport function map<T, U, E, C>(r: Err<E, C>, fn: (value: T) => U): Err<E, C>;\nexport function map<T, U, E, C>(r: Result<T, E, C>, fn: (value: T) => U): Result<U, E, C>;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function map(r: any, fn: any): any {\n return r.ok ? ok(fn(r.value)) : r;\n}\n\n/**\n * Transforms the error inside an Err result.\n *\n * @remarks When to use: Retype or normalize errors while leaving Ok values unchanged.\n */\nexport function mapError<T, E, F, C>(\n r: Result<T, E, C>,\n fn: (error: E, cause?: C) => F\n): Result<T, F, C> {\n return r.ok ? r : err(fn(r.error, r.cause), { cause: r.cause });\n}\n\n/**\n * Pattern match on a Result.\n *\n * @remarks When to use: Handle both Ok and Err in a single expression that returns a value.\n */\nexport function match<T, E, C, R>(r: Ok<T>, handlers: { ok: (value: T) => R; err: (error: E, cause?: C) => R }): R;\nexport function match<T, E, C, R>(r: Err<E, C>, handlers: { ok: (value: T) => R; err: (error: E, cause?: C) => R }): R;\nexport function match<T, E, C, R>(r: Result<T, E, C>, handlers: { ok: (value: T) => R; err: (error: E, cause?: C) => R }): R;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function match(r: any, handlers: any): any {\n return r.ok ? handlers.ok(r.value) : handlers.err(r.error, r.cause);\n}\n\n/**\n * Chain Result-returning functions.\n *\n * @remarks When to use: Chain dependent operations that return Result without nested branching.\n */\nexport function andThen<T, U>(r: Ok<T>, fn: (value: T) => Ok<U>): Ok<U>;\nexport function andThen<T, F, C2>(r: Ok<T>, fn: (value: T) => Err<F, C2>): Err<F, C2>;\nexport function andThen<T, U, F, C2>(r: Ok<T>, fn: (value: T) => Result<U, F, C2>): Result<U, F, C2>;\nexport function andThen<T, U, E, F, C1, C2>(r: Err<E, C1>, fn: (value: T) => Result<U, F, C2>): Err<E, C1>;\nexport function andThen<T, U, E, F, C1, C2>(r: Result<T, E, C1>, fn: (value: T) => Result<U, F, C2>): Result<U, E | F, C1 | C2>;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function andThen(r: any, fn: any): any {\n return r.ok ? fn(r.value) : r;\n}\n\n/**\n * Execute a side effect on Ok values.\n *\n * @remarks When to use: Add side effects (logging, metrics) on Ok without changing the Result.\n */\nexport function tap<T, E, C>(\n r: Result<T, E, C>,\n fn: (value: T) => void\n): Result<T, E, C> {\n if (r.ok) fn(r.value);\n return r;\n}\n\n/**\n * Execute a side effect on Err values.\n *\n * @remarks When to use: Add side effects (logging, metrics) on Err without changing the Result.\n */\nexport function tapError<T, E, C>(\n r: Result<T, E, C>,\n fn: (error: E, cause?: C) => void\n): Result<T, E, C> {\n if (!r.ok) fn(r.error, r.cause);\n return r;\n}\n\n/**\n * Transform value with a function that might throw.\n *\n * @remarks When to use: Transform Ok values with a function that might throw and capture the failure.\n */\nexport function mapTry<T, U, E, F, C>(\n r: Result<T, E, C>,\n fn: (value: T) => U,\n onError: (thrown: unknown) => F\n): Result<U, E | F, C | unknown> {\n if (!r.ok) return r;\n try {\n return ok(fn(r.value));\n } catch (error) {\n return err(onError(error), { cause: error });\n }\n}\n\n/**\n * Transform error with a function that might throw.\n *\n * @remarks When to use: Transform errors when the mapping might throw and you want that captured.\n */\nexport function mapErrorTry<T, E, F, G, C>(\n r: Result<T, E, C>,\n fn: (error: E) => F,\n onError: (thrown: unknown) => G\n): Result<T, F | G, C | unknown> {\n if (r.ok) return r;\n try {\n return err(fn(r.error), { cause: r.cause });\n } catch (error) {\n return err(onError(error), { cause: error });\n }\n}\n\n/**\n * Transform both value and error.\n */\nexport function bimap<T, U, E, F, C>(\n r: Result<T, E, C>,\n onOk: (value: T) => U,\n onErr: (error: E, cause?: C) => F\n): Result<U, F, C> {\n return r.ok ? ok(onOk(r.value)) : err(onErr(r.error, r.cause), { cause: r.cause });\n}\n\n/**\n * Provide an alternative Result if the first is an Err.\n *\n * @remarks When to use: Recover from Err by returning a fallback Result or retyping the error.\n */\nexport function orElse<T, E, E2, C, C2>(\n r: Result<T, E, C>,\n fn: (error: E, cause?: C) => Result<T, E2, C2>\n): Result<T, E2, C | C2> {\n return r.ok ? r : fn(r.error, r.cause);\n}\n\n/**\n * Async version of orElse.\n */\nexport async function orElseAsync<T, E, E2, C, C2>(\n r: Result<T, E, C>,\n fn: (error: E, cause?: C) => Promise<Result<T, E2, C2>>\n): Promise<Result<T, E2, C | C2>> {\n return r.ok ? r : fn(r.error, r.cause);\n}\n\n/**\n * Recover from errors - always returns Ok<T>.\n */\nexport function recover<T, E, C>(\n r: Result<T, E, C>,\n fn: (error: E, cause?: C) => T\n): Ok<T> {\n return r.ok ? ok(r.value) : ok(fn(r.error, r.cause));\n}\n\n/**\n * Async version of recover - always returns Promise<Ok<T>>.\n */\nexport async function recoverAsync<T, E, C>(\n r: Result<T, E, C> | Promise<Result<T, E, C>>,\n fn: (error: E, cause?: C) => T | Promise<T>\n): Promise<Ok<T>> {\n const resolved = await r;\n if (resolved.ok) return ok(resolved.value);\n return ok(await fn(resolved.error, resolved.cause));\n}\n\n// =============================================================================\n// Result Hydration (Serialization)\n// =============================================================================\n\n/**\n * Hydrate a serialized Result back into a proper Result object.\n */\nexport function hydrate<T, E, C = unknown>(value: unknown): Result<T, E, C> | null {\n if (typeof value !== \"object\" || value === null) return null;\n if (!(\"ok\" in value)) return null;\n\n const obj = value as Record<string, unknown>;\n if (obj.ok === true && \"value\" in obj) {\n return ok(obj.value as T);\n }\n if (obj.ok === false && \"error\" in obj) {\n return err(obj.error as E, { cause: obj.cause as C });\n }\n return null;\n}\n\n/**\n * Type guard to check if a value is a serialized Result.\n */\nexport function isSerializedResult(\n value: unknown\n): value is { ok: boolean; value?: unknown; error?: unknown; cause?: unknown } {\n if (typeof value !== \"object\" || value === null) return false;\n if (!(\"ok\" in value)) return false;\n const obj = value as Record<string, unknown>;\n return (\n (obj.ok === true && \"value\" in obj) ||\n (obj.ok === false && \"error\" in obj)\n );\n}\n\n// =============================================================================\n// Batch Operations\n// =============================================================================\n\ntype AllValues<T extends readonly Result<unknown, unknown, unknown>[]> = {\n [K in keyof T]: T[K] extends Ok<infer V>\n ? V\n : T[K] extends Err<unknown, unknown>\n ? never\n : T[K] extends Result<infer V, unknown, unknown>\n ? V\n : never;\n};\ntype AllErrors<T extends readonly Result<unknown, unknown, unknown>[]> = {\n [K in keyof T]: T[K] extends Ok<unknown>\n ? never\n : T[K] extends Err<infer E, unknown>\n ? E\n : T[K] extends Result<unknown, infer E, unknown>\n ? E\n : never;\n}[number];\ntype AllCauses<T extends readonly Result<unknown, unknown, unknown>[]> = {\n [K in keyof T]: T[K] extends Ok<unknown>\n ? never\n : T[K] extends Err<unknown, infer C>\n ? C\n : T[K] extends Result<unknown, unknown, infer C>\n ? C\n : never;\n}[number];\n\n// Conditional type: returns Ok<...> when there are no errors, Result<...> otherwise\n// Note: We only check AllErrors, not AllCauses - causes only matter when there are errors\ntype AllResult<T extends readonly Result<unknown, unknown, unknown>[]> =\n [AllErrors<T>] extends [never]\n ? Ok<AllValues<T>>\n : Result<AllValues<T>, AllErrors<T>, AllCauses<T>>;\n\n/**\n * Combines multiple Results into a single Result containing an array of values.\n * Returns the first Err encountered, or Ok with all values.\n */\nexport function all<const T extends readonly Result<unknown, unknown, unknown>[]>(\n results: T\n): AllResult<T> {\n const values: unknown[] = [];\n for (const result of results) {\n if (!result.ok) {\n return result as unknown as AllResult<T>;\n }\n values.push(result.value);\n }\n return ok(values) as AllResult<T>;\n}\n\n/**\n * Async version of all - works with Promises of Results.\n */\nexport async function allAsync<\n const T extends readonly (Result<unknown, unknown, unknown> | Promise<Result<unknown, unknown, unknown>>)[]\n>(\n results: T\n): Promise<\n Result<\n { [K in keyof T]: T[K] extends Result<infer V, unknown, unknown> | Promise<Result<infer V, unknown, unknown>> ? V : never },\n | { [K in keyof T]: T[K] extends Result<unknown, infer E, unknown> | Promise<Result<unknown, infer E, unknown>> ? E : never }[number]\n | PromiseRejectedError,\n | { [K in keyof T]: T[K] extends Result<unknown, unknown, infer C> | Promise<Result<unknown, unknown, infer C>> ? C : never }[number]\n | PromiseRejectionCause\n >\n> {\n const values: unknown[] = [];\n for (const resultOrPromise of results) {\n try {\n const r = await resultOrPromise;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (!r.ok) return r as any;\n values.push(r.value);\n } catch (reason) {\n return err(\n { type: PROMISE_REJECTED, cause: reason } as PromiseRejectedError,\n { cause: { type: \"PROMISE_REJECTION\", reason } as PromiseRejectionCause }\n );\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return ok(values) as any;\n}\n\nexport type SettledError<E, C = unknown> = { error: E; cause?: C };\n\n// Conditional type: returns Ok<...> when there are no errors, Result<...> otherwise\ntype AllSettledResult<T extends readonly Result<unknown, unknown, unknown>[]> =\n [AllErrors<T>] extends [never]\n ? Ok<AllValues<T>>\n : Result<AllValues<T>, SettledError<AllErrors<T>, AllCauses<T>>[]>;\n\n/**\n * Collects all Results, returning Ok with values if all succeed,\n * or Err with array of errors if any fail.\n */\nexport function allSettled<const T extends readonly Result<unknown, unknown, unknown>[]>(\n results: T\n): AllSettledResult<T> {\n const values: unknown[] = [];\n const errors: SettledError<unknown>[] = [];\n\n for (const result of results) {\n if (result.ok) {\n values.push(result.value);\n } else {\n errors.push({ error: result.error, cause: result.cause });\n }\n }\n\n if (errors.length > 0) {\n return err(errors) as unknown as AllSettledResult<T>;\n }\n\n return ok(values) as unknown as AllSettledResult<T>;\n}\n\n/**\n * Async version of allSettled.\n */\nexport async function allSettledAsync<\n const T extends readonly (Result<unknown, unknown, unknown> | Promise<Result<unknown, unknown, unknown>>)[]\n>(\n results: T\n): Promise<\n Result<\n { [K in keyof T]: T[K] extends Result<infer V, unknown, unknown> | Promise<Result<infer V, unknown, unknown>> ? V : never },\n SettledError<\n | { [K in keyof T]: T[K] extends Result<unknown, infer E, unknown> | Promise<Result<unknown, infer E, unknown>> ? E : never }[number]\n | PromiseRejectedError,\n | { [K in keyof T]: T[K] extends Result<unknown, unknown, infer C> | Promise<Result<unknown, unknown, infer C>> ? C : never }[number]\n | PromiseRejectionCause\n >[]\n >\n> {\n const settled = await Promise.all(\n results.map((item) =>\n Promise.resolve(item)\n .then((result) => ({ status: \"result\" as const, result }))\n .catch((reason) => ({\n status: \"rejected\" as const,\n error: { type: PROMISE_REJECTED, cause: reason } as PromiseRejectedError,\n cause: { type: \"PROMISE_REJECTION\", reason } as PromiseRejectionCause,\n }))\n )\n );\n\n const values: unknown[] = [];\n const errors: SettledError<unknown, unknown>[] = [];\n\n for (const item of settled) {\n if (item.status === \"rejected\") {\n errors.push({ error: item.error, cause: item.cause });\n } else if (item.result.ok) {\n values.push(item.result.value);\n } else {\n errors.push({ error: item.result.error, cause: item.result.cause });\n }\n }\n\n if (errors.length > 0) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return err(errors) as any;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return ok(values) as any;\n}\n\n/**\n * Partitions Results into { values, errors }.\n */\nexport function partition<T, E, C>(\n results: readonly Result<T, E, C>[]\n): { values: T[]; errors: E[] } {\n const values: T[] = [];\n const errors: E[] = [];\n for (const r of results) {\n if (r.ok) values.push(r.value);\n else errors.push(r.error);\n }\n return { values, errors };\n}\n\n/**\n * Returns the first Ok result, or an EmptyInputError/first Err if all fail.\n */\nexport function any<const T extends readonly Result<unknown, unknown, unknown>[]>(\n results: T\n): T extends readonly []\n ? Err<EmptyInputError, unknown>\n : Result<\n { [K in keyof T]: T[K] extends Result<infer V, unknown, unknown> ? V : never }[number],\n AllErrors<T> | EmptyInputError,\n AllCauses<T>\n >;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function any(results: any): any {\n if (results.length === 0) {\n return err({ type: \"EMPTY_INPUT\", message: \"any() requires at least one Result\" });\n }\n let firstErr: Err<unknown, unknown> | undefined;\n for (const r of results) {\n if (r.ok) return r;\n if (!firstErr) firstErr = r;\n }\n return firstErr;\n}\n\n/**\n * Async version of any - races promises and returns first success.\n */\nexport async function anyAsync<\n const T extends readonly (Result<unknown, unknown, unknown> | Promise<Result<unknown, unknown, unknown>>)[]\n>(\n results: T\n): Promise<\n T extends readonly []\n ? Err<EmptyInputError, unknown>\n : Result<\n { [K in keyof T]: T[K] extends Result<infer V, unknown, unknown> | Promise<Result<infer V, unknown, unknown>> ? V : never }[number],\n | { [K in keyof T]: T[K] extends Result<unknown, infer E, unknown> | Promise<Result<unknown, infer E, unknown>> ? E : never }[number]\n | EmptyInputError\n | PromiseRejectedError,\n | { [K in keyof T]: T[K] extends Result<unknown, unknown, infer C> | Promise<Result<unknown, unknown, infer C>> ? C : never }[number]\n | PromiseRejectionCause\n >\n> {\n if (results.length === 0) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return err({ type: \"EMPTY_INPUT\", message: \"anyAsync() requires at least one Result\" }) as any;\n }\n\n return new Promise((resolve) => {\n let settled = false;\n let pendingCount = results.length;\n let firstError: Err<unknown, unknown> | null = null;\n\n for (const item of results) {\n Promise.resolve(item)\n .catch((reason) =>\n err(\n { type: PROMISE_REJECTED, cause: reason } as PromiseRejectedError,\n { cause: { type: \"PROMISE_REJECTION\", reason } as PromiseRejectionCause }\n )\n )\n .then((result) => {\n if (settled) return;\n\n if (result.ok) {\n settled = true;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n resolve(result as any);\n return;\n }\n\n if (!firstError) firstError = result;\n pendingCount--;\n\n if (pendingCount === 0) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n resolve(firstError as any);\n }\n });\n }\n });\n}\n\n/**\n * Combines exactly two Results into a tuple.\n */\nexport function zip<A, EA, CA, B, EB, CB>(\n a: Result<A, EA, CA>,\n b: Result<B, EB, CB>\n): Result<[A, B], EA | EB, CA | CB> {\n if (!a.ok) return a;\n if (!b.ok) return b;\n return ok([a.value, b.value]);\n}\n\n/**\n * Async version of zip.\n */\nexport async function zipAsync<A, EA, CA, B, EB, CB>(\n a: Result<A, EA, CA> | Promise<Result<A, EA, CA>>,\n b: Result<B, EB, CB> | Promise<Result<B, EB, CB>>\n): Promise<Result<[A, B], EA | EB | PromiseRejectedError, CA | CB | PromiseRejectionCause>> {\n // Wrap rejections into PromiseRejectedError (consistent with allAsync)\n const wrapRejection = <T, E, C>(\n p: Result<T, E, C> | Promise<Result<T, E, C>>\n ): Promise<Result<T, E | PromiseRejectedError, C | PromiseRejectionCause>> =>\n Promise.resolve(p).catch((reason) =>\n err(\n { type: PROMISE_REJECTED, cause: reason } as PromiseRejectedError,\n { cause: { type: \"PROMISE_REJECTION\", reason } as PromiseRejectionCause }\n )\n );\n\n const [ra, rb] = await Promise.all([wrapRejection(a), wrapRejection(b)]);\n return zip(ra, rb);\n}\n\n// =============================================================================\n// Flatten\n// =============================================================================\n\n/**\n * Flattens a nested Result into a single Result.\n *\n * @remarks When to use: Unwrap a Result<Result<T, E1>, E2> into Result<T, E1 | E2> after an operation that returns nested Results.\n */\nexport function flatten<T, E1, C1, E2, C2>(\n result: Result<Result<T, E1, C1>, E2, C2>\n): Result<T, E1 | E2, C1 | C2> {\n if (!result.ok) return result as Err<E2, C2>;\n return result.value;\n}\n\n// =============================================================================\n// Deserialization (improved hydrate)\n// =============================================================================\n\n/** Discriminant for deserialization errors */\nexport const DESERIALIZATION_ERROR = \"DESERIALIZATION_ERROR\" as const;\n\n/** Error type returned when deserialize() receives invalid input */\nexport type DeserializationError = { type: typeof DESERIALIZATION_ERROR; value: unknown };\n\n/**\n * Deserialize a value back into a Result.\n * Returns a typed DeserializationError on invalid input instead of null.\n *\n * @remarks When to use: Rehydrate Results from JSON, RPC, or server actions with type-safe error handling.\n */\nexport function deserialize<T, E, C = unknown>(\n value: unknown\n): Result<T, E | DeserializationError, C> {\n if (typeof value !== \"object\" || value === null) {\n return err({ type: DESERIALIZATION_ERROR, value } as DeserializationError);\n }\n if (!(\"ok\" in value)) {\n return err({ type: DESERIALIZATION_ERROR, value } as DeserializationError);\n }\n\n const obj = value as Record<string, unknown>;\n if (obj.ok === true && \"value\" in obj) {\n return ok(obj.value as T);\n }\n if (obj.ok === false && \"error\" in obj) {\n return err(obj.error as E, { cause: obj.cause as C });\n }\n return err({ type: DESERIALIZATION_ERROR, value } as DeserializationError);\n}\n\n// =============================================================================\n// Serialization\n// =============================================================================\n\n/** A plain serialized form of a Result, safe to JSON.stringify. */\nexport type SerializedResult<T, E> = { ok: true; value: T } | { ok: false; error: E };\n\n/**\n * Serialize a Result to a plain object (inverse of `deserialize`).\n * Strips cause — safe for JSON.stringify, RPC, and server actions.\n *\n * @remarks When to use: Sending Results over the wire or storing them in JSON.\n */\nexport function serialize<T, E>(result: Result<T, E>): SerializedResult<T, E> {\n return result.ok\n ? { ok: true, value: result.value }\n : { ok: false, error: result.error };\n}\n\n// =============================================================================\n// Partial error matching\n// =============================================================================\n\n/**\n * Non-exhaustive error match — handle the errors you care about; let the rest fall through to fallback.\n *\n * @example\n * ```typescript\n * const message = matchErrorPartial(\n * error,\n * { NOT_FOUND: () => 'Resource not found' },\n * (e) => `Unexpected: ${e}`\n * );\n * ```\n */\nexport function matchErrorPartial<E extends string, R>(\n error: E | UnexpectedError,\n handlers: Partial<MatchErrorHandlers<E, R>>,\n fallback: (error: E | UnexpectedError) => R\n): R {\n if (isUnexpectedError(error)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const h = (handlers as any).UnexpectedError as ((e: UnexpectedError) => R) | undefined;\n return h ? h(error) : fallback(error);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const h = (handlers as any)[error as string] as ((e: E) => R) | undefined;\n return h ? h(error as E) : fallback(error);\n}\n\n// Retry helper is intentionally NOT re-exported here.\n// Import from the dedicated subpath to keep awaitly/result minimal:\n// import { tryAsyncRetry } from 'awaitly/result/retry';\n","/**\n * awaitly/functional\n *\n * Effect-inspired functional utilities for Result types.\n * Provides pipe-based composition with automatic error short-circuiting.\n */\n\nimport type { Result, AsyncResult, PromiseRejectedError, PromiseRejectionCause } from \"../result\";\nimport { ok, err, isOk, isErr, PROMISE_REJECTED } from \"../result\";\n\n// =============================================================================\n// Composition\n// =============================================================================\n\n/**\n * Pipe a value through a series of functions left-to-right.\n *\n * @example\n * ```typescript\n * const result = pipe(\n * 5,\n * (x) => x * 2,\n * (x) => x + 1\n * ); // 11\n * ```\n */\nexport function pipe<A>(a: A): A;\nexport function pipe<A, B>(a: A, ab: (a: A) => B): B;\nexport function pipe<A, B, C>(a: A, ab: (a: A) => B, bc: (b: B) => C): C;\nexport function pipe<A, B, C, D>(a: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D): D;\nexport function pipe<A, B, C, D, E>(\n a: 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 a: 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 a: 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 a: 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 a: 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;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function pipe(a: unknown, ...fns: Array<(x: any) => any>): unknown {\n return fns.reduce((acc, fn) => fn(acc), a);\n}\n\n/**\n * Compose functions left-to-right (returns a function).\n *\n * @example\n * ```typescript\n * const double = (x: number) => x * 2;\n * const addOne = (x: number) => x + 1;\n * const transform = flow(double, addOne);\n * transform(5); // 11\n * ```\n */\nexport function flow<A, B>(ab: (a: A) => B): (a: A) => B;\nexport function flow<A, B, C>(ab: (a: A) => B, bc: (b: B) => C): (a: A) => C;\nexport function flow<A, B, C, D>(ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D): (a: A) => D;\nexport function flow<A, 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, 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, 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, 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, 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;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function flow(...fns: Array<(x: any) => any>): (a: unknown) => unknown {\n return (a: unknown) => fns.reduce((acc, fn) => fn(acc), a);\n}\n\n/**\n * Compose functions right-to-left.\n *\n * @example\n * ```typescript\n * const double = (x: number) => x * 2;\n * const addOne = (x: number) => x + 1;\n * const transform = compose(addOne, double);\n * transform(5); // 11 (double first, then addOne)\n * ```\n */\nexport function compose<A, B>(ab: (a: A) => B): (a: A) => B;\nexport function compose<A, B, C>(bc: (b: B) => C, ab: (a: A) => B): (a: A) => C;\nexport function compose<A, B, C, D>(cd: (c: C) => D, bc: (b: B) => C, ab: (a: A) => B): (a: A) => D;\nexport function compose<A, B, C, D, E>(\n de: (d: D) => E,\n cd: (c: C) => D,\n bc: (b: B) => C,\n ab: (a: A) => B\n): (a: A) => E;\nexport function compose<A, B, C, D, E, F>(\n ef: (e: E) => F,\n de: (d: D) => E,\n cd: (c: C) => D,\n bc: (b: B) => C,\n ab: (a: A) => B\n): (a: A) => F;\nexport function compose<A, B, C, D, E, F, G>(\n fg: (f: F) => G,\n ef: (e: E) => F,\n de: (d: D) => E,\n cd: (c: C) => D,\n bc: (b: B) => C,\n ab: (a: A) => B\n): (a: A) => G;\nexport function compose<A, B, C, D, E, F, G, H>(\n gh: (g: G) => H,\n fg: (f: F) => G,\n ef: (e: E) => F,\n de: (d: D) => E,\n cd: (c: C) => D,\n bc: (b: B) => C,\n ab: (a: A) => B\n): (a: A) => H;\nexport function compose<A, B, C, D, E, F, G, H, I>(\n hi: (h: H) => I,\n gh: (g: G) => H,\n fg: (f: F) => G,\n ef: (e: E) => F,\n de: (d: D) => E,\n cd: (c: C) => D,\n bc: (b: B) => C,\n ab: (a: A) => B\n): (a: A) => I;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function compose(...fns: Array<(x: any) => any>): (a: unknown) => unknown {\n return (a: unknown) => fns.reduceRight((acc, fn) => fn(acc), a);\n}\n\n/**\n * Identity function - returns its argument unchanged.\n *\n * @example\n * ```typescript\n * identity(42); // 42\n * ```\n */\nexport const identity = <A>(a: A): A => a;\n\n// =============================================================================\n// Result Combinators (sync)\n// =============================================================================\n\n/**\n * Transform the success value of a Result.\n *\n * @example\n * ```typescript\n * const result = Awaitly.ok(5);\n * map(result, (x) => x * 2); // Awaitly.ok(10)\n *\n * const error = Awaitly.err(\"not found\");\n * map(error, (x) => x * 2); // Awaitly.err(\"not found\")\n * ```\n */\nexport function map<T, U, E, C>(result: Result<T, E, C>, fn: (value: T) => U): Result<U, E, C> {\n if (isOk(result)) {\n return ok(fn(result.value));\n }\n return result as Result<U, E, C>;\n}\n\n/**\n * Transform and flatten (short-circuits on error).\n *\n * @example\n * ```typescript\n * const divide = (a: number, b: number): Result<number, string> =>\n * b === 0 ? Awaitly.err(\"division by zero\") : Awaitly.ok(a / b);\n *\n * const result = Awaitly.ok(10);\n * flatMap(result, (x) => divide(x, 2)); // Awaitly.ok(5)\n * flatMap(result, (x) => divide(x, 0)); // Awaitly.err(\"division by zero\")\n * ```\n */\nexport function flatMap<T, U, E1, E2, C1, C2>(\n result: Result<T, E1, C1>,\n fn: (value: T) => Result<U, E2, C2>\n): Result<U, E1 | E2, C1 | C2> {\n if (isOk(result)) {\n return fn(result.value);\n }\n return result as Result<U, E1 | E2, C1 | C2>;\n}\n\n/**\n * Transform both success and error values.\n *\n * @example\n * ```typescript\n * const result = Awaitly.ok(5);\n * bimap(result, (x) => x * 2, (e) => `Error: ${e}`); // Awaitly.ok(10)\n *\n * const error = Awaitly.err(\"not found\");\n * bimap(error, (x) => x * 2, (e) => `Error: ${e}`); // Awaitly.err(\"Error: not found\")\n * ```\n */\nexport function bimap<T, U, E1, E2, C>(\n result: Result<T, E1, C>,\n onOk: (value: T) => U,\n onErr: (error: E1) => E2\n): Result<U, E2, C> {\n if (isOk(result)) {\n return ok(onOk(result.value));\n }\n return err(onErr(result.error), { cause: result.cause }) as Result<U, E2, C>;\n}\n\n/**\n * Transform the error value.\n *\n * @example\n * ```typescript\n * const error = Awaitly.err(\"not found\");\n * mapError(error, (e) => ({ type: \"ERROR\", message: e }));\n * // Awaitly.err({ type: \"ERROR\", message: \"not found\" })\n * ```\n */\nexport function mapError<T, E1, E2, C>(\n result: Result<T, E1, C>,\n fn: (error: E1) => E2\n): Result<T, E2, C> {\n if (isErr(result)) {\n return err(fn(result.error), { cause: result.cause }) as Result<T, E2, C>;\n }\n return result as Result<T, E2, C>;\n}\n\n/**\n * Side effect on success (returns original result).\n *\n * @example\n * ```typescript\n * const result = Awaitly.ok(5);\n * tap(result, (x) => console.log(`Value: ${x}`)); // logs \"Value: 5\", returns Awaitly.ok(5)\n * ```\n */\nexport function tap<T, E, C>(result: Result<T, E, C>, fn: (value: T) => void): Result<T, E, C> {\n if (isOk(result)) {\n fn(result.value);\n }\n return result;\n}\n\n/**\n * Side effect on error (returns original result).\n *\n * @example\n * ```typescript\n * const error = Awaitly.err(\"not found\");\n * tapError(error, (e) => console.log(`Error: ${e}`)); // logs \"Error: not found\", returns err\n * ```\n */\nexport function tapError<T, E, C>(result: Result<T, E, C>, fn: (error: E) => void): Result<T, E, C> {\n if (isErr(result)) {\n fn(result.error);\n }\n return result;\n}\n\n/**\n * Pattern match on Result.\n *\n * @example\n * ```typescript\n * const result = Awaitly.ok(5);\n * match(result, {\n * ok: (x) => `Success: ${x}`,\n * err: (e) => `Error: ${e}`\n * }); // \"Success: 5\"\n * ```\n */\nexport function match<T, E, U, C>(\n result: Result<T, E, C>,\n patterns: { ok: (value: T) => U; err: (error: E, cause?: C) => U }\n): U {\n if (isOk(result)) {\n return patterns.ok(result.value);\n }\n return patterns.err(result.error, result.cause);\n}\n\n/**\n * Recover from error by providing fallback value.\n *\n * @example\n * ```typescript\n * const error = Awaitly.err(\"not found\");\n * recover(error, () => 0); // 0\n *\n * const success = Awaitly.ok(5);\n * recover(success, () => 0); // 5\n * ```\n */\nexport function recover<T, E, C>(result: Result<T, E, C>, fn: (error: E) => T): T {\n if (isOk(result)) {\n return result.value;\n }\n return fn(result.error);\n}\n\n/**\n * Recover from error with another Result.\n *\n * @example\n * ```typescript\n * const error = Awaitly.err(\"not found\");\n * recoverWith(error, (e) => ok(0)); // ok(0)\n * recoverWith(error, (e) => err(\"still failed\")); // err(\"still failed\")\n * ```\n */\nexport function recoverWith<T, E1, E2, C1, C2>(\n result: Result<T, E1, C1>,\n fn: (error: E1) => Result<T, E2, C2>\n): Result<T, E2, C1 | C2> {\n if (isOk(result)) {\n return result as Result<T, E2, C1 | C2>;\n }\n return fn(result.error);\n}\n\n/**\n * Get the value or a default.\n *\n * @example\n * ```typescript\n * const error = Awaitly.err(\"not found\");\n * getOrElse(error, 0); // 0\n *\n * const success = Awaitly.ok(5);\n * getOrElse(success, 0); // 5\n * ```\n */\nexport function getOrElse<T, E, C>(result: Result<T, E, C>, defaultValue: T): T {\n if (isOk(result)) {\n return result.value;\n }\n return defaultValue;\n}\n\n/**\n * Get the value or compute a default lazily.\n *\n * @example\n * ```typescript\n * const error = Awaitly.err(\"not found\");\n * getOrElseLazy(error, () => expensiveComputation()); // calls expensiveComputation()\n *\n * const success = Awaitly.ok(5);\n * getOrElseLazy(success, () => expensiveComputation()); // 5, doesn't call expensiveComputation\n * ```\n */\nexport function getOrElseLazy<T, E, C>(result: Result<T, E, C>, fn: () => T): T {\n if (isOk(result)) {\n return result.value;\n }\n return fn();\n}\n\n// =============================================================================\n// Result Combinators (async)\n// =============================================================================\n\n/**\n * Transform success value asynchronously.\n *\n * @example\n * ```typescript\n * const result = Awaitly.ok(5);\n * await mapAsync(result, async (x) => x * 2); // ok(10)\n * ```\n */\nexport async function mapAsync<T, U, E, C>(\n result: Result<T, E, C> | AsyncResult<T, E, C>,\n fn: (value: T) => Promise<U>\n): AsyncResult<U, E, C> {\n const resolved = await result;\n if (isOk(resolved)) {\n return ok(await fn(resolved.value));\n }\n return resolved as Result<U, E, C>;\n}\n\n/**\n * Async flatMap.\n *\n * @example\n * ```typescript\n * const fetchUser = async (id: string): AsyncResult<User, \"NOT_FOUND\"> => { ... };\n * const result = Awaitly.ok(\"user-123\");\n * await flatMapAsync(result, fetchUser); // AsyncResult<User, \"NOT_FOUND\">\n * ```\n */\nexport async function flatMapAsync<T, U, E1, E2, C1, C2>(\n result: Result<T, E1, C1> | AsyncResult<T, E1, C1>,\n fn: (value: T) => AsyncResult<U, E2, C2>\n): AsyncResult<U, E1 | E2, C1 | C2> {\n const resolved = await result;\n if (isOk(resolved)) {\n return fn(resolved.value);\n }\n return resolved as Result<U, E1 | E2, C1 | C2>;\n}\n\n/**\n * Async tap - side effect on success.\n *\n * @example\n * ```typescript\n * const result = Awaitly.ok(5);\n * await tapAsync(result, async (x) => {\n * await logToServer(x);\n * }); // ok(5)\n * ```\n */\nexport async function tapAsync<T, E, C>(\n result: Result<T, E, C> | AsyncResult<T, E, C>,\n fn: (value: T) => Promise<void>\n): AsyncResult<T, E, C> {\n const resolved = await result;\n if (isOk(resolved)) {\n await fn(resolved.value);\n }\n return resolved;\n}\n\n/**\n * Async tapError - side effect on error.\n *\n * @example\n * ```typescript\n * const error = Awaitly.err(\"not found\");\n * await tapErrorAsync(error, async (e) => {\n * await logErrorToServer(e);\n * }); // err(\"not found\")\n * ```\n */\nexport async function tapErrorAsync<T, E, C>(\n result: Result<T, E, C> | AsyncResult<T, E, C>,\n fn: (error: E) => Promise<void>\n): AsyncResult<T, E, C> {\n const resolved = await result;\n if (isErr(resolved)) {\n await fn(resolved.error);\n }\n return resolved;\n}\n\n// =============================================================================\n// Collection Utilities (Result-aware)\n// =============================================================================\n\n/**\n * Combine array of Results - fails fast on first error.\n *\n * @example\n * ```typescript\n * all([ok(1), ok(2), ok(3)]); // ok([1, 2, 3])\n * all([ok(1), err(\"fail\"), ok(3)]); // err(\"fail\")\n * ```\n */\nexport function all<T, E, C>(results: Result<T, E, C>[]): Result<T[], E, C> {\n const values: T[] = [];\n for (const result of results) {\n if (isErr(result)) {\n return result as Result<T[], E, C>;\n }\n values.push(result.value);\n }\n return ok(values);\n}\n\n/**\n * Combine array of AsyncResults - parallel execution, fails fast.\n *\n * Returns immediately when any result fails, without waiting for\n * pending promises. Only returns all values if every result succeeds.\n *\n * @example\n * ```typescript\n * await allAsync([\n * fetchUser(\"1\"),\n * fetchUser(\"2\"),\n * fetchUser(\"3\")\n * ]); // AsyncResult<User[], \"NOT_FOUND\">\n * ```\n */\nexport async function allAsync<T, E, C>(\n results: AsyncResult<T, E, C>[]\n): AsyncResult<T[], E | PromiseRejectedError, C | PromiseRejectionCause> {\n if (results.length === 0) {\n return ok([]);\n }\n\n const values: T[] = new Array(results.length);\n let settledCount = 0;\n let done = false;\n\n return new Promise((resolve) => {\n results.forEach((resultPromise, index) => {\n resultPromise.then(\n (result) => {\n if (done) return;\n if (isErr(result)) {\n done = true;\n resolve(result as Result<T[], E | PromiseRejectedError, C | PromiseRejectionCause>);\n } else {\n values[index] = result.value;\n settledCount++;\n if (settledCount === results.length) {\n done = true;\n resolve(ok(values));\n }\n }\n },\n (reason) => {\n if (done) return;\n done = true;\n resolve(\n err(\n { type: PROMISE_REJECTED, cause: reason } as PromiseRejectedError,\n { cause: { type: \"PROMISE_REJECTION\" as const, reason } as PromiseRejectionCause }\n )\n );\n }\n );\n });\n });\n}\n\n/**\n * Collect all results, separating successes and failures.\n *\n * @example\n * ```typescript\n * allSettled([ok(1), err(\"a\"), ok(2), err(\"b\")]);\n * // { ok: [1, 2], err: [\"a\", \"b\"] }\n * ```\n */\nexport function allSettled<T, E, C>(results: Result<T, E, C>[]): { ok: T[]; err: E[] } {\n const okValues: T[] = [];\n const errValues: E[] = [];\n for (const result of results) {\n if (isOk(result)) {\n okValues.push(result.value);\n } else {\n errValues.push(result.error);\n }\n }\n return { ok: okValues, err: errValues };\n}\n\n/**\n * Async version of allSettled.\n *\n * Handles rejected promises by treating them as errors with\n * type PROMISE_REJECTED.\n *\n * @example\n * ```typescript\n * await allSettledAsync([\n * fetchUser(\"1\"),\n * fetchUser(\"2\"),\n * fetchUser(\"3\")\n * ]); // { ok: [...users], err: [...errors] }\n * ```\n */\nexport async function allSettledAsync<T, E, C>(\n results: AsyncResult<T, E, C>[]\n): Promise<{ ok: T[]; err: (E | PromiseRejectedError)[] }> {\n if (results.length === 0) {\n return { ok: [], err: [] };\n }\n\n type Settled = { type: \"ok\"; value: T } | { type: \"err\"; error: E | PromiseRejectedError };\n const settled: Settled[] = new Array(results.length);\n let settledCount = 0;\n\n return new Promise((resolve) => {\n results.forEach((resultPromise, index) => {\n resultPromise.then(\n (result) => {\n if (isOk(result)) {\n settled[index] = { type: \"ok\", value: result.value };\n } else {\n settled[index] = { type: \"err\", error: result.error };\n }\n settledCount++;\n if (settledCount === results.length) {\n const okValues: T[] = [];\n const errValues: (E | PromiseRejectedError)[] = [];\n for (const s of settled) {\n if (s.type === \"ok\") {\n okValues.push(s.value);\n } else {\n errValues.push(s.error);\n }\n }\n resolve({ ok: okValues, err: errValues });\n }\n },\n (reason) => {\n settled[index] = { type: \"err\", error: { type: PROMISE_REJECTED, cause: reason } as PromiseRejectedError };\n settledCount++;\n if (settledCount === results.length) {\n const okValues: T[] = [];\n const errValues: (E | PromiseRejectedError)[] = [];\n for (const s of settled) {\n if (s.type === \"ok\") {\n okValues.push(s.value);\n } else {\n errValues.push(s.error);\n }\n }\n resolve({ ok: okValues, err: errValues });\n }\n }\n );\n });\n });\n}\n\n/**\n * Return first success, or all errors if all fail.\n *\n * @example\n * ```typescript\n * any([err(\"a\"), ok(1), err(\"b\")]); // ok(1)\n * any([err(\"a\"), err(\"b\"), err(\"c\")]); // err([\"a\", \"b\", \"c\"])\n * ```\n */\nexport function any<T, E, C>(results: Result<T, E, C>[]): Result<T, E[], C> {\n const errors: E[] = [];\n for (const result of results) {\n if (isOk(result)) {\n return result as Result<T, E[], C>;\n }\n errors.push(result.error);\n }\n return err(errors);\n}\n\n/**\n * Async version of any - returns first success immediately.\n *\n * Returns as soon as any result succeeds, without waiting for\n * pending promises. Only returns all errors if every result fails.\n *\n * @example\n * ```typescript\n * await anyAsync([\n * fetchFromCache(key),\n * fetchFromDb(key),\n * fetchFromApi(key)\n * ]); // First successful result\n * ```\n */\nexport async function anyAsync<T, E, C>(\n results: AsyncResult<T, E, C>[]\n): AsyncResult<T, (E | PromiseRejectedError)[], C | PromiseRejectionCause> {\n if (results.length === 0) {\n return err([]);\n }\n\n const errors: (E | PromiseRejectedError | undefined)[] = new Array(results.length);\n let settledCount = 0;\n let done = false;\n\n return new Promise((resolve) => {\n results.forEach((resultPromise, index) => {\n resultPromise.then(\n (result) => {\n if (done) return;\n if (isOk(result)) {\n done = true;\n resolve(result as Result<T, (E | PromiseRejectedError)[], C | PromiseRejectionCause>);\n } else {\n errors[index] = result.error;\n settledCount++;\n if (settledCount === results.length) {\n done = true;\n resolve(err(errors.filter((e): e is E | PromiseRejectedError => e !== undefined)));\n }\n }\n },\n (reason) => {\n if (done) return;\n errors[index] = { type: PROMISE_REJECTED, cause: reason } as PromiseRejectedError;\n settledCount++;\n if (settledCount === results.length) {\n done = true;\n resolve(err(errors.filter((e): e is E | PromiseRejectedError => e !== undefined)));\n }\n }\n );\n });\n });\n}\n\n/**\n * Race async results - first to complete wins.\n *\n * Handles rejected promises by converting them to err() results\n * with type PROMISE_REJECTED.\n *\n * @example\n * ```typescript\n * await race([\n * fetchFromPrimaryServer(id),\n * fetchFromBackupServer(id)\n * ]); // Result from whichever server responds first\n * ```\n */\nexport async function race<T, E, C>(\n results: AsyncResult<T, E, C>[]\n): AsyncResult<T, E | PromiseRejectedError, C | PromiseRejectionCause> {\n return Promise.race(\n results.map((p) =>\n p.catch(\n (reason) =>\n err(\n { type: PROMISE_REJECTED, cause: reason } as PromiseRejectedError,\n { cause: { type: \"PROMISE_REJECTION\" as const, reason } as PromiseRejectionCause }\n ) as Result<T, E | PromiseRejectedError, C | PromiseRejectionCause>\n )\n )\n );\n}\n\n/**\n * Sequence an array through a Result-returning function.\n * Stops on first error.\n *\n * @example\n * ```typescript\n * const validate = (x: number): Result<number, string> =>\n * x > 0 ? ok(x) : err(\"must be positive\");\n *\n * traverse([1, 2, 3], validate); // ok([1, 2, 3])\n * traverse([1, -2, 3], validate); // err(\"must be positive\")\n * ```\n */\nexport function traverse<T, U, E, C>(\n items: T[],\n fn: (item: T, index: number) => Result<U, E, C>\n): Result<U[], E, C> {\n const results: U[] = [];\n for (let i = 0; i < items.length; i++) {\n const result = fn(items[i]!, i);\n if (isErr(result)) {\n return result as Result<U[], E, C>;\n }\n results.push(result.value);\n }\n return ok(results);\n}\n\n/**\n * Async version of traverse.\n *\n * @example\n * ```typescript\n * await traverseAsync(userIds, async (id) => fetchUser(id));\n * ```\n */\nexport async function traverseAsync<T, U, E, C>(\n items: T[],\n fn: (item: T, index: number) => AsyncResult<U, E, C>\n): AsyncResult<U[], E, C> {\n const results: U[] = [];\n for (let i = 0; i < items.length; i++) {\n const result = await fn(items[i]!, i);\n if (isErr(result)) {\n return result as Result<U[], E, C>;\n }\n results.push(result.value);\n }\n return ok(results);\n}\n\n/**\n * Parallel traverse - executes all in parallel, fails fast.\n *\n * Returns immediately when any result fails, without waiting for\n * pending operations. Only returns all values if every result succeeds.\n *\n * @example\n * ```typescript\n * await traverseParallel(userIds, fetchUser);\n * ```\n */\nexport async function traverseParallel<T, U, E, C>(\n items: T[],\n fn: (item: T, index: number) => AsyncResult<U, E, C>\n): AsyncResult<U[], E | PromiseRejectedError, C | PromiseRejectionCause> {\n return allAsync(items.map((item, index) => fn(item, index)));\n}\n\n// =============================================================================\n// Pipeable Result Functions (R namespace)\n// =============================================================================\n\n/**\n * Curried Result combinators for use in pipe().\n *\n * @example\n * ```typescript\n * import { pipe, R } from 'awaitly/functional';\n *\n * const result = pipe(\n * fetchUser(id),\n * R.flatMap(user => fetchPosts(user.id)),\n * R.map(posts => posts.filter(p => p.published)),\n * R.tap(posts => console.log(`Found ${posts.length} posts`)),\n * R.match({\n * ok: posts => `Found ${posts.length} posts`,\n * err: error => `Failed: ${error}`\n * })\n * );\n * ```\n */\nexport const R = {\n /** Curried map for use in pipe() */\n map:\n <T, U, E, C>(fn: (value: T) => U) =>\n (result: Result<T, E, C>): Result<U, E, C> =>\n map(result, fn),\n\n /** Curried flatMap for use in pipe() */\n flatMap:\n <T, U, E1, E2, C1, C2>(fn: (value: T) => Result<U, E2, C2>) =>\n (result: Result<T, E1, C1>): Result<U, E1 | E2, C1 | C2> =>\n flatMap(result, fn),\n\n /** Curried bimap for use in pipe() */\n bimap:\n <T, U, E1, E2, C>(onOk: (value: T) => U, onErr: (error: E1) => E2) =>\n (result: Result<T, E1, C>): Result<U, E2, C> =>\n bimap(result, onOk, onErr),\n\n /** Curried mapError for use in pipe() */\n mapError:\n <T, E1, E2, C>(fn: (error: E1) => E2) =>\n (result: Result<T, E1, C>): Result<T, E2, C> =>\n mapError(result, fn),\n\n /** Curried tap for use in pipe() */\n tap:\n <T, E, C>(fn: (value: T) => void) =>\n (result: Result<T, E, C>): Result<T, E, C> =>\n tap(result, fn),\n\n /** Curried tapError for use in pipe() */\n tapError:\n <T, E, C>(fn: (error: E) => void) =>\n (result: Result<T, E, C>): Result<T, E, C> =>\n tapError(result, fn),\n\n /** Curried match for use in pipe() */\n match:\n <T, E, U, C>(patterns: { ok: (value: T) => U; err: (error: E, cause?: C) => U }) =>\n (result: Result<T, E, C>): U =>\n match(result, patterns),\n\n /** Curried recover for use in pipe() */\n recover:\n <T, E, C>(fn: (error: E) => T) =>\n (result: Result<T, E, C>): T =>\n recover(result, fn),\n\n /** Curried recoverWith for use in pipe() */\n recoverWith:\n <T, E1, E2, C1, C2>(fn: (error: E1) => Result<T, E2, C2>) =>\n (result: Result<T, E1, C1>): Result<T, E2, C1 | C2> =>\n recoverWith(result, fn),\n\n /** Curried getOrElse for use in pipe() */\n getOrElse:\n <T, E, C>(defaultValue: T) =>\n (result: Result<T, E, C>): T =>\n getOrElse(result, defaultValue),\n\n /** Curried getOrElseLazy for use in pipe() */\n getOrElseLazy:\n <T, E, C>(fn: () => T) =>\n (result: Result<T, E, C>): T =>\n getOrElseLazy(result, fn),\n};\n"],"mappings":"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","names":["PROMISE_REJECTED","ok","value","err","error","options","cause","isOk","r","isErr","pipe","a","fns","acc","fn","flow","compose","identity","map","result","isOk","ok","flatMap","bimap","onOk","onErr","err","mapError","isErr","tap","tapError","match","patterns","recover","recoverWith","getOrElse","defaultValue","getOrElseLazy","mapAsync","resolved","flatMapAsync","tapAsync","tapErrorAsync","all","results","values","allAsync","settledCount","done","resolve","resultPromise","index","reason","PROMISE_REJECTED","allSettled","okValues","errValues","allSettledAsync","settled","s","any","errors","anyAsync","e","race","p","traverse","items","i","traverseAsync","traverseParallel","item","R"]}
@@ -1,5 +1,5 @@
1
- import { ah as WorkflowEvent } from './run-entry-C1uFytM6.cjs';
2
- import { A as ApprovalRejected, P as PendingApproval, f as PendingHook, R as ResumeState, e as WorkflowCancelledError } from './persistence-entry-CgVzswbg.cjs';
1
+ import { ad as WorkflowEvent } from './run-entry-yQu63Yj9.cjs';
2
+ import { A as ApprovalRejected, P as PendingApproval, c as PendingHook, R as ResumeState, W as WorkflowCancelledError } from './persistence-entry-jflY61az.cjs';
3
3
 
4
4
  /**
5
5
  * Type guards for workflow events and errors.
@@ -69,4 +69,4 @@ declare function isApprovalRejected(error: unknown): error is ApprovalRejected;
69
69
  */
70
70
  declare function isPendingHook(error: unknown): error is PendingHook;
71
71
 
72
- export { isPendingApproval as a, isWorkflowCancelled as b, isPendingHook as c, isResumeState as d, isStepComplete as e, isApprovalRejected as i };
72
+ export { isApprovalRejected as a, isPendingApproval as b, isPendingHook as c, isResumeState as d, isStepComplete as e, isWorkflowCancelled as i };
@@ -1,5 +1,5 @@
1
- import { ah as WorkflowEvent } from './run-entry-C1uFytM6.js';
2
- import { A as ApprovalRejected, P as PendingApproval, f as PendingHook, R as ResumeState, e as WorkflowCancelledError } from './persistence-entry-B3ukwbb5.js';
1
+ import { ad as WorkflowEvent } from './run-entry-rw7zll_G.js';
2
+ import { A as ApprovalRejected, P as PendingApproval, c as PendingHook, R as ResumeState, W as WorkflowCancelledError } from './persistence-entry-ClFhxd2Q.js';
3
3
 
4
4
  /**
5
5
  * Type guards for workflow events and errors.
@@ -69,4 +69,4 @@ declare function isApprovalRejected(error: unknown): error is ApprovalRejected;
69
69
  */
70
70
  declare function isPendingHook(error: unknown): error is PendingHook;
71
71
 
72
- export { isPendingApproval as a, isWorkflowCancelled as b, isPendingHook as c, isResumeState as d, isStepComplete as e, isApprovalRejected as i };
72
+ export { isApprovalRejected as a, isPendingApproval as b, isPendingHook as c, isResumeState as d, isStepComplete as e, isWorkflowCancelled as i };
@@ -1,5 +1,5 @@
1
- import { ah as WorkflowEvent, c as AsyncResult, d as Err } from './run-entry-C1uFytM6.cjs';
2
- import { R as ResumeState, P as PendingApproval, a as ApprovalStepOptions, A as ApprovalRejected, G as GatedStepOptions } from './persistence-entry-CgVzswbg.cjs';
1
+ import { ad as WorkflowEvent, c as AsyncResult, d as Err } from './run-entry-yQu63Yj9.cjs';
2
+ import { R as ResumeState, P as PendingApproval, b as ApprovalStepOptions, A as ApprovalRejected, G as GatedStepOptions } from './persistence-entry-jflY61az.cjs';
3
3
 
4
4
  /**
5
5
  * Resume state helpers: collectors and state manipulation for workflow replay.
@@ -1,5 +1,5 @@
1
- import { ah as WorkflowEvent, c as AsyncResult, d as Err } from './run-entry-C1uFytM6.js';
2
- import { R as ResumeState, P as PendingApproval, a as ApprovalStepOptions, A as ApprovalRejected, G as GatedStepOptions } from './persistence-entry-B3ukwbb5.js';
1
+ import { ad as WorkflowEvent, c as AsyncResult, d as Err } from './run-entry-rw7zll_G.js';
2
+ import { R as ResumeState, P as PendingApproval, b as ApprovalStepOptions, A as ApprovalRejected, G as GatedStepOptions } from './persistence-entry-ClFhxd2Q.js';
3
3
 
4
4
  /**
5
5
  * Resume state helpers: collectors and state manipulation for workflow replay.