@nicolastoulemont/std 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,3 @@
1
1
  import { a as FxError, c as FxSuccess, d as FxYield, f as FxYieldable, g as isServiceRequest, h as SyncFx, i as Fx$1, l as FxTypeId, m as ServiceRequest, n as AsyncFxGenerator, o as FxGenerator, p as RunnableFx, r as AsyncFxYieldable, s as FxRequirements, t as AsyncFx, u as FxValue } from "../fx.types-DO-8yG4c.mjs";
2
- import { A as gen, C as isServiceClass, D as err, E as TaggedMatch, M as run, N as Defect, O as fn, P as Exit, S as ServiceOf, T as Fx, _ as createScope, a as Layer$1, b as ServiceClass, c as LayerROut, d as UnprovidedDeps, f as MemoMap, g as ScopeTag, h as ScopeService, i as Layer, j as ok, k as fxMatch, l as MergeError, m as ExcludeScope, n as provideContext, o as LayerError, p as createMemoMap, r as provideService, s as LayerRIn, t as provide, u as MergeROut, v as Context, w as serviceTag, x as ServiceKey, y as Service } from "../index-DQoTXLSm.mjs";
2
+ import { A as gen, C as isServiceClass, D as err, E as TaggedMatch, M as run, N as Defect, O as fn, P as Exit, S as ServiceOf, T as Fx, _ as createScope, a as Layer$1, b as ServiceClass, c as LayerROut, d as UnprovidedDeps, f as MemoMap, g as ScopeTag, h as ScopeService, i as Layer, j as ok, k as fxMatch, l as MergeError, m as ExcludeScope, n as provideContext, o as LayerError, p as createMemoMap, r as provideService, s as LayerRIn, t as provide, u as MergeROut, v as Context, w as serviceTag, x as ServiceKey, y as Service } from "../index-UYodvXes.mjs";
3
3
  export { AsyncFx, AsyncFxGenerator, AsyncFxYieldable, Context, Context as ContextType, ExcludeScope, Exit, Exit as ExitType, Defect as ExitDefect, Fx, FxError, FxGenerator, Fx$1 as FxProtocol, Fx$1 as FxType, FxRequirements, FxSuccess, FxTypeId, FxValue, FxYield, FxYieldable, Layer, LayerError, LayerRIn, LayerROut, Layer$1 as LayerType, MemoMap, MergeError, MergeROut, RunnableFx, ScopeTag as Scope, ScopeService, Service, ServiceClass, ServiceKey, ServiceOf, ServiceRequest, SyncFx, TaggedMatch, UnprovidedDeps, createMemoMap, createScope, err, fn, gen, isServiceClass, isServiceRequest, fxMatch as match, ok, provide, provideContext, provideService, run, serviceTag };
@@ -1 +1 @@
1
- {"version":3,"file":"fx-C4UuWCqP.mjs","names":["ok","err","isServiceClass","exitDefect","exitErr","exitOk","gen","resultOk","resultErr","service","impl","ctx","gen","layerGen","layerResult","ok","gen","gen","fxGen","fxResult","ok"],"sources":["../src/fx/exit.ts","../src/fx/fx.ts","../src/fx/service.ts","../src/fx/context.ts","../src/fx/layer.ts","../src/fx/scope.ts","../src/fx/memo-map.ts","../src/fx/provide.ts"],"sourcesContent":["import { dual } from \"../shared/dual\"\nimport type { Err, Ok } from \"../shared/type-utils.types\"\n\n// ============================================================================\n// Exit Types - Flat 3-variant discriminated union\n// ============================================================================\n\n/**\n * Represents an unexpected thrown exception (defect) caught during Fx execution.\n */\nexport type Defect = {\n readonly _tag: \"Defect\"\n readonly defect: unknown\n}\n\n/**\n * Exit represents the outcome of an Fx computation.\n * A flat 3-variant discriminated union that cleanly separates:\n * - `Ok<A>`: successful result with value of type A\n * - `Err<E>`: typed failure with error of type E\n * - `Defect`: unexpected thrown exception (defect)\n *\n * @example\n * ```ts\n * const exit = Fx.run(computation)\n * switch (exit._tag) {\n * case \"Ok\": exit.value // A\n * case \"Err\": exit.error // E (clean!)\n * case \"Defect\": exit.defect // unknown\n * }\n * ```\n */\nexport type Exit<A, E> = Ok<A> | Err<E> | Defect\n\n// ============================================================================\n// Constructors\n// ============================================================================\n\n/**\n * Create a successful Exit.\n */\nexport const ok = <A>(value: A): Ok<A> => ({ _tag: \"Ok\", value })\n\n/**\n * Create a typed failure Exit.\n */\nexport const err = <E>(error: E): Err<E> => ({ _tag: \"Err\", error })\n\n/**\n * Create a defect Exit from an unexpected thrown value.\n */\nexport const defect = (thrown: unknown): Defect => ({ _tag: \"Defect\", defect: thrown })\n\n// ============================================================================\n// Guards\n// ============================================================================\n\n/**\n * Check if an Exit is a successful result.\n */\nconst isOk = <A, E>(exit: Exit<A, E>): exit is Ok<A> => exit._tag === \"Ok\"\n\n/**\n * Check if an Exit is a typed failure.\n */\nconst isErr = <A, E>(exit: Exit<A, E>): exit is Err<E> => exit._tag === \"Err\"\n\n/**\n * Check if an Exit is an unexpected defect.\n */\nconst isDefect = <A, E>(exit: Exit<A, E>): exit is Defect => exit._tag === \"Defect\"\n\n// ============================================================================\n// Match\n// ============================================================================\n\n/**\n * Handler functions for Exit.match.\n */\ntype ExitMatch<A, E, R> = {\n readonly Ok: (value: A) => R\n readonly Err: (error: E) => R\n readonly Defect: (defect: unknown) => R\n}\n\n/**\n * Pattern match on an Exit value.\n *\n * @example\n * ```ts\n * // Data-first\n * Exit.match(exit, {\n * Ok: (value) => `Success: ${value}`,\n * Err: (error) => `Error: ${error}`,\n * Defect: (defect) => `Defect: ${defect}`,\n * })\n *\n * // Data-last (pipe)\n * pipe(exit, Exit.match({\n * Ok: (value) => `Success: ${value}`,\n * Err: (error) => `Error: ${error}`,\n * Defect: (defect) => `Defect: ${defect}`,\n * }))\n * ```\n */\nconst match: {\n <A, E, R>(exit: Exit<A, E>, handlers: ExitMatch<A, E, R>): R\n <A, E, R>(handlers: ExitMatch<A, E, R>): (exit: Exit<A, E>) => R\n} = dual(2, <A, E, R>(exit: Exit<A, E>, handlers: ExitMatch<A, E, R>): R => {\n switch (exit._tag) {\n case \"Ok\":\n return handlers.Ok(exit.value)\n case \"Err\":\n return handlers.Err(exit.error)\n case \"Defect\":\n return handlers.Defect(exit.defect)\n }\n})\n\n// ============================================================================\n// Utility\n// ============================================================================\n\n/**\n * Extract the value from an Ok exit, or throw.\n * Useful for tests and scripts where you expect success.\n *\n * @throws The error for Err exits, or the defect for Defect exits\n */\nconst getOrThrow = <A, E>(exit: Exit<A, E>): A => {\n switch (exit._tag) {\n case \"Ok\":\n return exit.value\n case \"Err\":\n throw exit.error\n case \"Defect\":\n throw exit.defect\n }\n}\n\n// ============================================================================\n// Namespace\n// ============================================================================\n\n/**\n * Exit namespace containing all Exit utilities.\n */\nexport const Exit = {\n ok,\n err,\n defect,\n isOk,\n isErr,\n isDefect,\n match,\n getOrThrow,\n} as const\n","import { NoSuchElementError } from \"../option/option.types\"\nimport { ok as resultOk, err as resultErr } from \"../result/result\"\nimport { dual } from \"../shared/dual\"\nimport { ok as exitOk, err as exitErr, defect as exitDefect } from \"./exit\"\nimport type { Exit } from \"./exit\"\nimport { FxTypeId } from \"./fx.types\"\nimport type {\n RunnableFx,\n SyncFx,\n AsyncFx,\n Fx as FxProtocol,\n FxError,\n FxRequirements,\n FxGenerator,\n AsyncFxGenerator,\n} from \"./fx.types\"\n\n// ============================================================================\n// Fx.run - Execute computations\n// ============================================================================\n\n/**\n * Execute a sync Fx computation and return the Exit.\n * Catches unexpected thrown exceptions and wraps them as Defect.\n * Only available when R = never (all dependencies provided).\n *\n * @param fx - The sync computation to execute\n * @returns Exit<A, E>\n */\nfunction fxRun<A, E>(fx: SyncFx<A, E>): Exit<A, E>\n\n/**\n * Execute an async Fx computation and return a Promise of the Exit.\n * Catches unexpected thrown exceptions and wraps them as Defect.\n * Only available when R = never (all dependencies provided).\n *\n * @param fx - The async computation to execute\n * @returns Promise<Exit<A, E>>\n */\nfunction fxRun<A, E>(fx: AsyncFx<A, E>): Promise<Exit<A, E>>\n\n/**\n * Execute an Fx computation (union type).\n * Returns Exit for sync, Promise<Exit> for async.\n * Catches unexpected thrown exceptions and wraps them as Defect.\n */\nfunction fxRun<A, E>(fx: RunnableFx<A, E>): Exit<A, E> | Promise<Exit<A, E>>\n\n/**\n * Implementation of Fx.run.\n * Detects sync vs async and executes appropriately.\n */\nfunction fxRun<A, E>(fx: RunnableFx<A, E>): Exit<A, E> | Promise<Exit<A, E>> {\n if (fx._tag === \"AsyncFx\") {\n return runAsync(fx)\n }\n return runSync(fx)\n}\n\n/**\n * Check if a value is a ServiceClass (yielded for service injection).\n */\nfunction isServiceClass(value: unknown): value is { _tag: \"Service\"; key: string } {\n return typeof value === \"object\" && value !== null && \"_tag\" in value && value._tag === \"Service\"\n}\n\n/**\n * Internal helper to run a sync Fx computation.\n * Wraps execution in try-catch to capture unexpected thrown exceptions as Defect.\n */\nfunction runSync<A, E>(fx: SyncFx<A, E>): Exit<A, E> {\n try {\n const gen = fx[Symbol.iterator]()\n const result = gen.next()\n\n if (result.done !== true) {\n const yielded = result.value as unknown\n // Check for ServiceClass (which is what gets yielded now)\n if (isServiceClass(yielded)) {\n return exitDefect(new Error(`Service \"${yielded.key}\" not provided. Use provide() to inject services.`))\n }\n // Check for NoSuchElementError (from Option.none())\n if (yielded instanceof NoSuchElementError) {\n return exitErr(yielded as E)\n }\n // Check for Result.err - extract the error field\n if (typeof yielded === \"object\" && yielded !== null && \"_tag\" in yielded && yielded._tag === \"Err\") {\n /* oxlint-disable no-unsafe-type-assertion -- extracting error from Result with _tag Err */\n return exitErr((yielded as Record<string, unknown>)[\"error\"] as E)\n /* oxlint-enable no-unsafe-type-assertion */\n }\n // Otherwise it's a raw error (shouldn't happen with proper types, but handle for safety)\n return exitErr(yielded as E)\n }\n\n return exitOk(result.value)\n } catch (thrown) {\n return exitDefect(thrown)\n }\n}\n\n/**\n * Internal helper to run an async Fx computation.\n * Wraps execution in try-catch to capture unexpected thrown exceptions as Defect.\n */\nasync function runAsync<A, E>(fx: AsyncFx<A, E>): Promise<Exit<A, E>> {\n try {\n const gen = fx[Symbol.asyncIterator]()\n const result = await gen.next()\n\n if (result.done !== true) {\n const yielded = result.value as unknown\n // Check for ServiceClass (which is what gets yielded now)\n if (isServiceClass(yielded)) {\n return exitDefect(new Error(`Service \"${yielded.key}\" not provided. Use provide() to inject services.`))\n }\n // Check for NoSuchElementError (from Option.none())\n if (yielded instanceof NoSuchElementError) {\n return exitErr(yielded as E)\n }\n // Check for Result.err - extract the error field\n if (typeof yielded === \"object\" && yielded !== null && \"_tag\" in yielded && yielded._tag === \"Err\") {\n /* oxlint-disable no-unsafe-type-assertion -- extracting error from Result with _tag Err */\n return exitErr((yielded as Record<string, unknown>)[\"error\"] as E)\n /* oxlint-enable no-unsafe-type-assertion */\n }\n // Otherwise it's a raw error (shouldn't happen with proper types, but handle for safety)\n return exitErr(yielded as E)\n }\n\n return exitOk(result.value)\n } catch (thrown) {\n return exitDefect(thrown)\n }\n}\n\n// ============================================================================\n// Fx.gen - Create composable computations\n// ============================================================================\n\n/**\n * Create a composable computation from a sync generator function.\n * Returns a SyncFx that can be stored, passed around, and executed later.\n *\n * @template Yielded - The type of values yielded by the generator (must implement Fx protocol)\n * @template A - The success value type\n * @param generatorFn - A function that returns a sync generator\n * @returns SyncFx<A, FxError<Yielded>, FxRequirements<Yielded>>\n *\n * @example\n * ```ts\n * const getUser = (id: string) => Fx.gen(function* () {\n * const db = yield* Database\n * const logger = yield* Logger\n *\n * logger.info(`Fetching user ${id}`)\n * return yield* db.query<User>(`SELECT * FROM users WHERE id = '${id}'`)\n * })\n * // Type: SyncFx<User[], DatabaseError, Database | Logger>\n *\n * // Execute later with dependencies provided\n * const exit = pipe(getUser(\"123\"), provide(AppLayer)).run()\n * ```\n */\nfunction fxGen<Yielded extends FxProtocol<unknown, unknown, unknown>, A>(\n generatorFn: () => Generator<Yielded, A, unknown>,\n): SyncFx<A, FxError<Yielded>, FxRequirements<Yielded>>\n\n/**\n * Create a composable computation from an async generator function.\n * Returns an AsyncFx that can be stored, passed around, and executed later.\n *\n * @template Yielded - The type of values yielded by the generator (must implement Fx protocol)\n * @template A - The success value type\n * @param generatorFn - A function that returns an async generator\n * @returns AsyncFx<A, FxError<Yielded>, FxRequirements<Yielded>>\n *\n * @example\n * ```ts\n * const fetchData = (url: string) => Fx.gen(async function* () {\n * const logger = yield* Logger\n *\n * logger.info(`Fetching ${url}`)\n * const response = await fetch(url)\n * return yield* Result.fromTry(async () => await response.json())\n * })\n * // Type: AsyncFx<unknown, Error, Logger>\n * ```\n */\nfunction fxGen<Yielded extends FxProtocol<unknown, unknown, unknown>, A>(\n generatorFn: () => AsyncGenerator<Yielded, A, unknown>,\n): AsyncFx<A, FxError<Yielded>, FxRequirements<Yielded>>\n\n/**\n * Create a composable computation from a sync generator function that takes parameters.\n * Returns a factory function that, when called with parameters, produces a SyncFx.\n *\n * @template P - The parameter types (must be non-empty)\n * @template Yielded - The type of values yielded by the generator (must implement Fx protocol)\n * @template A - The success value type\n * @param generatorFn - A function that takes parameters and returns a sync generator\n * @returns A factory function that produces SyncFx<A, FxError<Yielded>, FxRequirements<Yielded>>\n *\n * @example\n * ```ts\n * const getUser = Fx.gen(function* ({userId}: {userId: string}) {\n * const db = yield* Database\n * return yield* db.query(`SELECT * FROM users WHERE id = '${userId}'`)\n * })\n * // Type: (params: {userId: string}) => SyncFx<...>\n *\n * const exit = Fx.run(pipe(getUser({userId: \"123\"}), provide(DbLayer)))\n * ```\n */\nfunction fxGen<P extends [unknown, ...unknown[]], Yielded extends FxProtocol<unknown, unknown, unknown>, A>(\n generatorFn: (...params: P) => Generator<Yielded, A, unknown>,\n): (...params: P) => SyncFx<A, FxError<Yielded>, FxRequirements<Yielded>>\n\n/**\n * Create a composable computation from an async generator function that takes parameters.\n * Returns a factory function that, when called with parameters, produces an AsyncFx.\n *\n * @template P - The parameter types (must be non-empty)\n * @template Yielded - The type of values yielded by the generator (must implement Fx protocol)\n * @template A - The success value type\n * @param generatorFn - A function that takes parameters and returns an async generator\n * @returns A factory function that produces AsyncFx<A, FxError<Yielded>, FxRequirements<Yielded>>\n *\n * @example\n * ```ts\n * const fetchUser = Fx.gen(async function* ({url}: {url: string}) {\n * const response = await fetch(url)\n * return yield* Result.fromTry(async () => await response.json())\n * })\n * // Type: (params: {url: string}) => AsyncFx<...>\n * ```\n */\nfunction fxGen<P extends [unknown, ...unknown[]], Yielded extends FxProtocol<unknown, unknown, unknown>, A>(\n generatorFn: (...params: P) => AsyncGenerator<Yielded, A, unknown>,\n): (...params: P) => AsyncFx<A, FxError<Yielded>, FxRequirements<Yielded>>\n\n/**\n * Implementation of unified Fx.gen function.\n * Detects sync vs async generator and returns appropriate computation type.\n * For parameterized generators (length > 0), returns a factory function.\n */\n// oxlint-disable-next-line no-explicit-any\nfunction fxGen(generatorFn: (...args: any[]) => any): any {\n if (generatorFn.length > 0) {\n return (...params: unknown[]) => fxGen(() => generatorFn(...params))\n }\n\n // Check if we're dealing with async generator\n const testGen = generatorFn()\n const isAsync = Symbol.asyncIterator in testGen\n\n if (isAsync) {\n return {\n _tag: \"AsyncFx\",\n [FxTypeId]: {\n _A: () => undefined,\n _E: () => undefined,\n _R: () => undefined,\n },\n // oxlint-disable-next-line no-explicit-any\n async *[Symbol.asyncIterator](): AsyncGenerator<any, any, unknown> {\n const gen = generatorFn()\n let result = await gen.next()\n\n while (!result.done) {\n // Pass through yields (errors or services as Fx values)\n const injected = yield result.value\n // oxlint-disable-next-line no-await-in-loop\n result = await gen.next(injected)\n }\n\n return result.value\n },\n }\n }\n\n // Sync generator\n return {\n _tag: \"SyncFx\",\n [FxTypeId]: {\n _A: () => undefined,\n _E: () => undefined,\n _R: () => undefined,\n },\n // oxlint-disable-next-line no-explicit-any\n *[Symbol.iterator](): Generator<any, any, unknown> {\n const gen = generatorFn()\n let result = gen.next()\n\n while (!result.done) {\n const injected = yield result.value\n result = gen.next(injected)\n }\n\n return result.value\n },\n }\n}\n\n// ============================================================================\n// Fx.fn - Execute computations immediately\n// ============================================================================\n\n/**\n * Execute a sync computation immediately and return the Exit.\n * Catches unexpected thrown exceptions and wraps them as Defect.\n * For computations without service dependencies.\n *\n * @template A - The success value type\n * @template E - The error type\n * @param generatorFn - A function that returns a sync generator\n * @returns Exit<A, E>\n *\n * @example\n * ```ts\n * const exit = Fx.fn(function* () {\n * const a = yield* Result.ok(10)\n * const b = yield* Result.ok(20)\n * return a + b\n * })\n * // Type: Exit<number, never>\n * // exit = { _tag: \"Ok\", value: 30 }\n * ```\n */\nfunction fxFn<A, E>(generatorFn: () => FxGenerator<A, E, never>): Exit<A, E>\n\n/**\n * Execute an async computation immediately and return a Promise of the Exit.\n * Catches unexpected thrown exceptions and wraps them as Defect.\n * For computations without service dependencies.\n *\n * @template A - The success value type\n * @template E - The error type\n * @param generatorFn - A function that returns an async generator\n * @returns Promise<Exit<A, E>>\n *\n * @example\n * ```ts\n * const exit = await Fx.fn(async function* () {\n * const response = await fetch(\"/api/users\")\n * const data = yield* Result.fromTry(async () => await response.json())\n * return data\n * })\n * // Type: Promise<Exit<unknown, Error>>\n * ```\n */\nfunction fxFn<A, E>(generatorFn: () => AsyncFxGenerator<A, E, never>): Promise<Exit<A, E>>\n\n/**\n * Execute a sync computation with service dependencies immediately.\n * Catches unexpected thrown exceptions and wraps them as Defect.\n * The second argument is required when the computation has service requirements (R ≠ never).\n *\n * @template A - The success value type\n * @template E - The error type from the computation\n * @template E2 - The error type from the provider (layer)\n * @template R - The required services type\n * @param generatorFn - A function that returns a sync generator with service requirements\n * @param provider - A function that provides the services (e.g., provide(AppLayer))\n * @returns Exit<A, E | E2>\n *\n * @example\n * ```ts\n * const exit = Fx.fn(function* () {\n * const config = yield* Config\n * const logger = yield* Logger\n * logger.info(`DB URL: ${config.dbUrl}`)\n * return config.dbUrl\n * }, provide(AppLayer))\n * // Type: Exit<string, never>\n * ```\n */\nfunction fxFn<A, E, E2, R>(\n generatorFn: () => FxGenerator<A, E, R>,\n provider: (fx: RunnableFx<A, E, R>) => RunnableFx<A, E | E2>,\n): Exit<A, E | E2>\n\n/**\n * Execute an async computation with service dependencies immediately.\n * Catches unexpected thrown exceptions and wraps them as Defect.\n * The second argument is required when the computation has service requirements (R ≠ never).\n *\n * @template A - The success value type\n * @template E - The error type from the computation\n * @template E2 - The error type from the provider (layer)\n * @template R - The required services type\n * @param generatorFn - A function that returns an async generator with service requirements\n * @param provider - A function that provides the services (e.g., provide(AppLayer))\n * @returns Promise<Exit<A, E | E2>>\n *\n * @example\n * ```ts\n * const exit = await Fx.fn(async function* () {\n * const config = yield* Config\n * await doAsyncWork()\n * return config.dbUrl\n * }, provide(AppLayer))\n * // Type: Promise<Exit<string, never>>\n * ```\n */\nfunction fxFn<A, E, E2, R>(\n generatorFn: () => AsyncFxGenerator<A, E, R>,\n provider: (fx: RunnableFx<A, E, R>) => RunnableFx<A, E | E2>,\n): Promise<Exit<A, E | E2>>\n\n/**\n * Implementation of Fx.fn.\n * Reuses fxGen() for Fx creation and fxRun() for execution to ensure consistent behavior.\n */\nfunction fxFn<A, E, E2, R>(\n generatorFn: () => FxGenerator<A, E, R> | AsyncFxGenerator<A, E, R>,\n provider?: (fx: RunnableFx<A, E, R>) => RunnableFx<A, E | E2>,\n): Exit<A, E | E2> | Promise<Exit<A, E | E2>> {\n // Create the Fx using fxGen (single source of truth for Fx creation)\n // Type cast needed because fxGen infers E/R from yielded Fx values,\n // while fxFn receives E/R as explicit type parameters\n // oxlint-disable-next-line no-explicit-any\n const fx = fxGen(generatorFn as any) as RunnableFx<A, E, R>\n\n if (provider) {\n // Apply provider and run\n const provided = provider(fx)\n return fxRun(provided as RunnableFx<A, E | E2>) as Exit<A, E | E2> | Promise<Exit<A, E | E2>>\n }\n\n // No provider - run directly (R must be never at the type level)\n return fxRun(fx as RunnableFx<A, E | E2>) as Exit<A, E | E2> | Promise<Exit<A, E | E2>>\n}\n\n// ============================================================================\n// Fx.ok / Fx.err - Convenience aliases\n// ============================================================================\n\n/**\n * Convenience alias for Result.ok.\n * Creates a successful Result that can be yielded in an Fx computation.\n *\n * @param value - The success value\n * @returns Result<T, never>\n *\n * @example\n * ```ts\n * const workflow = Fx.gen(function* () {\n * const value = yield* Fx.ok(42)\n * return value * 2\n * })\n * ```\n */\nconst fxOk = resultOk\n\n/**\n * Convenience alias for Result.err.\n * Creates an error Result that can be yielded in an Fx computation.\n *\n * @param error - The error value\n * @returns Result<never, E>\n *\n * @example\n * ```ts\n * const workflow = Fx.gen(function* () {\n * const config = yield* Config\n *\n * if (!config.dbUrl) {\n * return yield* Fx.err(new ValidationError({ field: \"dbUrl\" }))\n * }\n *\n * return config.dbUrl\n * })\n * ```\n */\nconst fxErr = resultErr\n\n// ============================================================================\n// Fx.match - Universal pattern matching\n// ============================================================================\n\n/**\n * Handler functions for matching on a tagged union by `_tag` discriminator.\n * Each handler receives the narrowed variant corresponding to its tag key.\n */\nexport type TaggedMatch<T extends { readonly _tag: string }, R> = {\n readonly [K in T[\"_tag\"]]: (variant: Extract<T, { readonly _tag: K }>) => R\n}\n\n/**\n * Generic pattern matcher for any `_tag`-based discriminated union.\n *\n * Works with Exit, tagged errors, or any type with a `readonly _tag` discriminator.\n * Each handler receives the full narrowed variant object for its tag.\n *\n * Supports both data-first and data-last (pipe) calling styles.\n *\n * @example\n * ```ts\n * // Match on Exit\n * Fx.match(exit, {\n * Ok: (ok) => ok.value,\n * Err: (err) =>\n * Fx.match(err.error, {\n * DatabaseError: (e) => e.message,\n * NotFoundError: (e) => e.resourceId,\n * }),\n * Defect: (d) => String(d.defect),\n * })\n *\n * // Data-last with pipe\n * pipe(exit, Fx.match({\n * Ok: (ok) => ok.value,\n * Err: (err) => \"error\",\n * Defect: (d) => \"defect\",\n * }))\n * ```\n */\nconst fxMatch: {\n <T extends { readonly _tag: string }, R>(value: T, handlers: TaggedMatch<T, R>): R\n <T extends { readonly _tag: string }, R>(handlers: TaggedMatch<T, R>): (value: T) => R\n} = dual(\n 2,\n // oxlint-disable-next-line no-explicit-any\n (value: any, handlers: any): any => handlers[value._tag](value),\n)\n\n// ============================================================================\n// Exports\n// ============================================================================\n\n// Export individual functions\nexport const gen = fxGen\nexport const fn = fxFn\nexport const run = fxRun\nexport const ok = fxOk\nexport const err = fxErr\nexport { fxMatch as match }\n\n// Export internal helpers for use in other modules (provide, scope)\nexport { runSync, runAsync }\n\n/**\n * Fx namespace containing utilities for creating and running effectful computations.\n *\n * Fx provides a minimal API inspired by Effect.ts:\n * - `Fx.gen()` - Create composable computations with service dependencies\n * - `Fx.fn()` - Execute computations immediately\n * - `Fx.run()` - Execute a computation (when all dependencies are provided)\n * - `Fx.ok()` - Create successful results (alias for Result.ok)\n * - `Fx.err()` - Create error results (alias for Result.err)\n *\n * @example\n * ```ts\n * import { Fx, Service, Layer, provide, pipe, Exit } from \"@repo/std\"\n *\n * // Define services\n * class Config extends Service<Config>()(\"Config\") {\n * readonly dbUrl!: string\n * }\n *\n * class Logger extends Service<Logger>()(\"Logger\") {\n * readonly info!: (msg: string) => void\n * }\n *\n * // Create layers\n * const ConfigLive = Layer.ok(Config, { dbUrl: \"postgres://...\" })\n * const LoggerLive = Layer.fx(Logger)(\n * Fx.gen(function* () {\n * const config = yield* Config\n * return { info: (msg) => console.log(`[${config.dbUrl}] ${msg}`) }\n * })\n * )\n *\n * // Create workflow\n * const myWorkflow = Fx.gen(function* () {\n * const logger = yield* Logger\n * logger.info(\"Hello from Fx!\")\n * return \"done\"\n * })\n *\n * // Compose and run\n * const AppLayer = pipe(ConfigLive, Layer.provide(LoggerLive))\n * const exit = Fx.run(pipe(myWorkflow, provide(AppLayer)))\n * // exit._tag === \"Ok\" | \"Err\" | \"Defect\"\n * ```\n */\nexport const Fx = {\n gen: fxGen,\n fn: fxFn,\n run: fxRun,\n ok: fxOk,\n err: fxErr,\n match: fxMatch,\n} as const\n","import { FxTypeId } from \"./fx.types\"\nimport type { Fx } from \"./fx.types\"\n\n// ============================================================================\n// Service Class Types\n// ============================================================================\n\n/**\n * The interface returned by Service()().\n * Acts as both a type tag and a runtime lookup key.\n * Implements Fx protocol with E = never (no errors) and R = Self (requires itself).\n * When yielded, yields itself (as Fx) for proper type inference.\n */\nexport type ServiceClass<Self, Key extends string = string> = Fx<Self, never, Self> & {\n readonly _tag: \"Service\"\n readonly key: Key\n // Phantom type\n readonly _Self: Self\n\n /**\n * Yielding the service class in a gen computation\n * returns the service instance from context.\n * Yields the ServiceClass itself (which implements Fx) for type inference.\n */\n [Symbol.iterator](): Generator<ServiceClass<Self, Key>, Self, unknown>\n}\n\n/**\n * Extract the service type from a ServiceClass.\n */\nexport type ServiceOf<T> = T extends ServiceClass<infer S> ? S : never\n\n/**\n * Extract the key from a ServiceClass.\n */\nexport type ServiceKey<T> = T extends ServiceClass<unknown, infer K> ? K : never\n\n// ============================================================================\n// Service Factory\n// ============================================================================\n\n/**\n * Define a service with a unique key.\n * The returned class acts as both a type and a runtime tag for lookup.\n *\n * Usage follows a double-invocation pattern:\n * - First call provides the Self type parameter\n * - Second call provides the unique key\n *\n * @example\n * ```ts\n * class Config extends Service<Config>()(\"Config\") {\n * readonly dbUrl!: string\n * readonly logLevel!: \"debug\" | \"info\" | \"error\"\n * }\n *\n * class Logger extends Service<Logger>()(\"Logger\") {\n * readonly info!: (msg: string) => void\n * readonly error!: (msg: string) => void\n * }\n *\n * // Use in Fx.gen:\n * const workflow = Fx.gen(function* () {\n * const config = yield* Config\n * const logger = yield* Logger\n * logger.info(`DB URL: ${config.dbUrl}`)\n * })\n * ```\n */\nexport function Service<Self>(): <Key extends string>(key: Key) => ServiceClass<Self, Key> & (new () => Self) {\n return <Key extends string>(key: Key): ServiceClass<Self, Key> & (new () => Self) => {\n // Create the base class with proper prototype\n // oxlint-disable-next-line typescript/no-extraneous-class\n const ServiceBase = class {\n static readonly _tag = \"Service\" as const\n static readonly key: Key = key\n static readonly _Self: Self = undefined as unknown as Self\n\n static readonly [FxTypeId] = {\n _A: () => undefined as unknown as Self,\n _E: () => undefined as never,\n _R: () => undefined as unknown as Self,\n };\n\n /**\n * Yielding the class returns the class itself (for type inference).\n * The runtime intercepts this and provides the actual service instance.\n */\n static *[Symbol.iterator](): Generator<typeof ServiceBase, Self, Self> {\n // Yield the class itself - it implements Fx<Self, never, Self>\n // The runtime will recognize ServiceClass and inject the service\n const serviceInstance = yield ServiceBase\n return serviceInstance\n }\n }\n\n // Return with correct typing\n return ServiceBase as unknown as ServiceClass<Self, Key> & (new () => Self)\n }\n}\n\n/**\n * Create a service tag without class syntax.\n * Useful for simple services that don't need class inheritance.\n *\n * @example\n * ```ts\n * interface ConfigService {\n * readonly dbUrl: string\n * readonly logLevel: \"debug\" | \"info\" | \"error\"\n * }\n *\n * const Config = serviceTag<ConfigService>(\"Config\")\n *\n * // Use in Fx.gen:\n * const workflow = Fx.gen(function* () {\n * const config = yield* Config\n * console.log(config.dbUrl)\n * })\n * ```\n */\nexport function serviceTag<S>(key: string): ServiceClass<S> {\n const tag: ServiceClass<S> = {\n _tag: \"Service\",\n key,\n _Self: undefined as unknown as S,\n [FxTypeId]: {\n _A: () => undefined as unknown as S,\n _E: () => undefined as never,\n _R: () => undefined as unknown as S,\n },\n *[Symbol.iterator](): Generator<ServiceClass<S>, S, S> {\n // Yield the tag itself - it implements Fx<S, never, S>\n // The runtime will recognize ServiceClass and inject the service\n const serviceInstance = yield tag\n return serviceInstance\n },\n }\n return tag\n}\n\n/**\n * Check if a value is a ServiceClass.\n */\nexport const isServiceClass = (value: unknown): value is ServiceClass<unknown> =>\n typeof value === \"object\" && value !== null && \"_tag\" in value && value._tag === \"Service\" && \"key\" in value\n","import type { ServiceClass } from \"./service\"\n\n// ============================================================================\n// Context Type\n// ============================================================================\n\n/**\n * Context<Services> is an immutable map storing service implementations.\n * The Services type parameter tracks which services are available.\n */\nexport type Context<Services = never> = {\n readonly _tag: \"Context\"\n readonly _services: ReadonlyMap<string, unknown>\n // Phantom type for tracking available services\n readonly _Services: Services\n}\n\n// ============================================================================\n// Context Constructors\n// ============================================================================\n\n/**\n * Create an empty context with no services.\n */\nconst empty = (): Context => ({\n _tag: \"Context\",\n _services: new Map(),\n _Services: undefined as never,\n})\n\n/**\n * Create a context with a single service.\n *\n * @param service - The service class (tag)\n * @param impl - The service implementation\n * @returns A context containing the service\n *\n * @example\n * ```ts\n * const ctx = Context.make(Config, { dbUrl: \"postgres://...\", logLevel: \"info\" })\n * ```\n */\nconst make = <S>(service: ServiceClass<S>, impl: S): Context<S> => ({\n _tag: \"Context\",\n _services: new Map([[service.key, impl]]),\n _Services: undefined as unknown as S,\n})\n\n// ============================================================================\n// Context Operations\n// ============================================================================\n\n/**\n * Add a service to an existing context (returns new context).\n * Curried for use with pipe.\n *\n * @param service - The service class (tag)\n * @param impl - The service implementation\n * @returns A function that takes a context and returns a new context with the service added\n *\n * @example\n * ```ts\n * const ctx = pipe(\n * Context.empty(),\n * Context.add(Config, configImpl),\n * Context.add(Logger, loggerImpl),\n * )\n * ```\n */\nconst add =\n <S>(service: ServiceClass<S>, impl: S) =>\n <Existing>(ctx: Context<Existing>): Context<Existing | S> => ({\n _tag: \"Context\",\n _services: new Map([...ctx._services, [service.key, impl]]),\n _Services: undefined as unknown as Existing | S,\n })\n\n/**\n * Merge two contexts together.\n * If both contexts have the same service, the second context's implementation wins.\n *\n * @param a - First context\n * @param b - Second context\n * @returns A new context with services from both\n *\n * @example\n * ```ts\n * const ctx = Context.merge(configContext, loggerContext)\n * ```\n */\nconst merge = <A, B>(a: Context<A>, b: Context<B>): Context<A | B> => ({\n _tag: \"Context\",\n _services: new Map([...a._services, ...b._services]),\n _Services: undefined as unknown as A | B,\n})\n\n/**\n * Get a service from a context.\n * Throws if the service is not found.\n *\n * @param service - The service class (tag)\n * @returns The service implementation\n * @throws Error if service not found\n *\n * @example\n * ```ts\n * const config = Context.get(ctx, Config)\n * ```\n */\n// Use overload to handle both curried and uncurried calls\nfunction get<S>(ctx: Context<S>, service: ServiceClass<S>): S\nfunction get<S>(service: ServiceClass<S>): (ctx: Context<S>) => S\nfunction get<S>(\n ctxOrService: Context<S> | ServiceClass<S>,\n maybeService?: ServiceClass<S>,\n): S | ((ctx: Context<S>) => S) {\n // Curried form: get(service)(ctx)\n if (maybeService === undefined) {\n const service = ctxOrService as ServiceClass<S>\n return (ctx: Context<S>): S => {\n const impl = ctx._services.get(service.key)\n if (impl === undefined) {\n throw new Error(\n `Service \"${service.key}\" not found in context. Available services: [${[...ctx._services.keys()].join(\", \")}]`,\n )\n }\n return impl as S\n }\n }\n\n // Uncurried form: get(ctx, service)\n const ctx = ctxOrService as Context<S>\n const service = maybeService\n const impl = ctx._services.get(service.key)\n if (impl === undefined) {\n throw new Error(\n `Service \"${service.key}\" not found in context. Available services: [${[...ctx._services.keys()].join(\", \")}]`,\n )\n }\n return impl as S\n}\n\n/**\n * Unsafely get a service from a context by key string.\n * Used internally by the runtime when resolving ServiceRequests.\n * Returns undefined if not found (caller should handle).\n */\nconst unsafeGet = (ctx: Context<unknown>, key: string): unknown => ctx._services.get(key)\n\n/**\n * Check if a context contains a specific service.\n *\n * @param ctx - The context to check\n * @param service - The service class (tag)\n * @returns true if the service is in the context\n */\nconst has = <S>(ctx: Context<unknown>, service: ServiceClass<S>): boolean => ctx._services.has(service.key)\n\n/**\n * Get all service keys in a context.\n */\nconst keys = (ctx: Context<unknown>): string[] => [...ctx._services.keys()]\n\n/**\n * Get the size (number of services) in a context.\n */\nconst size = (ctx: Context<unknown>): number => ctx._services.size\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Check if a value is a Context.\n */\nconst isContext = (value: unknown): value is Context<unknown> =>\n typeof value === \"object\" && value !== null && \"_tag\" in value && value._tag === \"Context\"\n\n// ============================================================================\n// Context Namespace\n// ============================================================================\n\n/**\n * Context namespace containing utilities for managing service contexts.\n *\n * A Context is an immutable map of services that can be provided to Fx computations.\n * Services are identified by their unique keys.\n *\n * @example\n * ```ts\n * import { Context, Service } from \"@repo/std\"\n *\n * class Config extends Service<Config>()(\"Config\") {\n * readonly dbUrl!: string\n * }\n *\n * class Logger extends Service<Logger>()(\"Logger\") {\n * readonly info!: (msg: string) => void\n * }\n *\n * // Create a context with services\n * const ctx = pipe(\n * Context.empty(),\n * Context.add(Config, { dbUrl: \"postgres://...\" }),\n * Context.add(Logger, { info: console.log }),\n * )\n *\n * // Or use make and merge\n * const configCtx = Context.make(Config, { dbUrl: \"postgres://...\" })\n * const loggerCtx = Context.make(Logger, { info: console.log })\n * const fullCtx = Context.merge(configCtx, loggerCtx)\n * ```\n */\nexport const Context = {\n empty,\n make,\n add,\n merge,\n get,\n unsafeGet,\n has,\n keys,\n size,\n isContext,\n} as const\n","import { Context } from \"./context\"\nimport { FxTypeId } from \"./fx.types\"\nimport type { RunnableFx, SyncFx, AsyncFx, FxYield } from \"./fx.types\"\nimport type { Layer as LayerType, MergeROut, MergeError, UnprovidedDeps, AllSync } from \"./layer.types\"\nimport type { ScopeService, ExcludeScope } from \"./scope\"\nimport { isServiceClass } from \"./service\"\nimport type { ServiceClass } from \"./service\"\n\n/**\n * Create a layer from a synchronous value (no dependencies).\n */\nconst layerOk = <S>(service: ServiceClass<S>, impl: S): LayerType<S, never, never, true> => ({\n _tag: \"Layer\",\n _ROut: undefined as unknown as S,\n _E: undefined as never,\n _RIn: undefined as never,\n _Sync: undefined as unknown as true,\n build: (): SyncFx<Context<S>, never> => ({\n _tag: \"SyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as Context<S>,\n _E: () => undefined as never,\n _R: () => undefined as never,\n },\n // oxlint-disable-next-line require-yield\n *[Symbol.iterator](): Generator<never, Context<S>, unknown> {\n return Context.make(service, impl)\n },\n }),\n})\n\n/**\n * Create a layer that always fails with an error.\n */\nconst layerErr = <E>(error: E): LayerType<never, E, never, true> => ({\n _tag: \"Layer\",\n _ROut: undefined as never,\n _E: undefined as unknown as E,\n _RIn: undefined as never,\n _Sync: undefined as unknown as true,\n build: (): SyncFx<Context, E> => ({\n _tag: \"SyncFx\",\n [FxTypeId]: {\n _A: () => undefined as never,\n _E: () => error,\n _R: () => undefined as never,\n },\n *[Symbol.iterator](): Generator<E, never, unknown> {\n yield error\n throw new Error(\"Unreachable\")\n },\n }),\n})\n\n/**\n * Create a layer from an Fx computation (can have dependencies).\n * The Sync type parameter is inferred from the input fx:\n * - SyncFx input → Layer with Sync=true\n * - AsyncFx input → Layer with Sync=false\n */\nfunction layerFx<S>(service: ServiceClass<S>): {\n <E, R>(fx: SyncFx<S, E, R>): LayerType<S, E, R, true>\n <E, R>(fx: AsyncFx<S, E, R>): LayerType<S, E, R, false>\n <E, R>(fx: RunnableFx<S, E, R>): LayerType<S, E, R, boolean>\n}\nfunction layerFx<S>(service: ServiceClass<S>) {\n return <E, R>(fx: RunnableFx<S, E, R>): LayerType<S, E, R, boolean> => ({\n _tag: \"Layer\",\n _ROut: undefined as unknown as S,\n _E: undefined as unknown as E,\n _RIn: undefined as unknown as R,\n _Sync: undefined as unknown as boolean,\n build: (): RunnableFx<Context<S>, E, R> => {\n if (fx._tag === \"AsyncFx\") {\n return {\n _tag: \"AsyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as Context<S>,\n _E: () => undefined as unknown as E,\n _R: () => undefined as unknown as R,\n },\n async *[Symbol.asyncIterator](): AsyncGenerator<FxYield<E, R>, Context<S>, unknown> {\n const gen = fx[Symbol.asyncIterator]()\n let result = await gen.next()\n while (!result.done) {\n const value = yield result.value\n // oxlint-disable-next-line no-await-in-loop\n result = await gen.next(value)\n }\n return Context.make(service, result.value)\n },\n } as AsyncFx<Context<S>, E, R>\n }\n\n return {\n _tag: \"SyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as Context<S>,\n _E: () => undefined as unknown as E,\n _R: () => undefined as unknown as R,\n },\n *[Symbol.iterator](): Generator<FxYield<E, R>, Context<S>, unknown> {\n const gen = fx[Symbol.iterator]()\n let result = gen.next()\n while (!result.done) {\n const value = yield result.value\n result = gen.next(value)\n }\n return Context.make(service, result.value)\n },\n } as SyncFx<Context<S>, E, R>\n },\n })\n}\n\n/**\n * Create a scoped layer (with resource cleanup).\n * The Sync type parameter is inferred from the input fx.\n */\nfunction layerScoped<S>(service: ServiceClass<S>): {\n <E, R>(fx: SyncFx<S, E, R | ScopeService>): LayerType<S, E, ExcludeScope<R>, true>\n <E, R>(fx: AsyncFx<S, E, R | ScopeService>): LayerType<S, E, ExcludeScope<R>, false>\n <E, R>(fx: RunnableFx<S, E, R | ScopeService>): LayerType<S, E, ExcludeScope<R>, boolean>\n}\nfunction layerScoped<S>(service: ServiceClass<S>) {\n return <E, R>(fx: RunnableFx<S, E, R | ScopeService>): LayerType<S, E, ExcludeScope<R>, boolean> => ({\n _tag: \"Layer\",\n _ROut: undefined as unknown as S,\n _E: undefined as unknown as E,\n _RIn: undefined as unknown as ExcludeScope<R>,\n _Sync: undefined as unknown as boolean,\n build: (_memoMap, scope): RunnableFx<Context<S>, E, ExcludeScope<R>> => {\n if (fx._tag === \"AsyncFx\") {\n return {\n _tag: \"AsyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as Context<S>,\n _E: () => undefined as unknown as E,\n _R: () => undefined as unknown as ExcludeScope<R>,\n },\n async *[Symbol.asyncIterator](): AsyncGenerator<FxYield<E, ExcludeScope<R>>, Context<S>, unknown> {\n const gen = fx[Symbol.asyncIterator]()\n let result = await gen.next()\n while (!result.done) {\n const yielded = result.value\n if (isServiceClass(yielded) && yielded.key === \"@std/Scope\") {\n // oxlint-disable-next-line no-await-in-loop\n result = await gen.next(scope)\n } else {\n const value = yield yielded as FxYield<E, ExcludeScope<R>>\n // oxlint-disable-next-line no-await-in-loop\n result = await gen.next(value)\n }\n }\n return Context.make(service, result.value)\n },\n } as AsyncFx<Context<S>, E, ExcludeScope<R>>\n }\n\n return {\n _tag: \"SyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as Context<S>,\n _E: () => undefined as unknown as E,\n _R: () => undefined as unknown as ExcludeScope<R>,\n },\n *[Symbol.iterator](): Generator<FxYield<E, ExcludeScope<R>>, Context<S>, unknown> {\n const gen = fx[Symbol.iterator]()\n let result = gen.next()\n while (!result.done) {\n const yielded = result.value\n if (isServiceClass(yielded) && yielded.key === \"@std/Scope\") {\n result = gen.next(scope)\n } else {\n const value = yield yielded as FxYield<E, ExcludeScope<R>>\n result = gen.next(value)\n }\n }\n return Context.make(service, result.value)\n },\n } as SyncFx<Context<S>, E, ExcludeScope<R>>\n },\n })\n}\n\n// ============================================================================\n// Layer Composition\n// ============================================================================\n\n/**\n * Provide dependencies to a layer and merge outputs.\n * Sync is preserved only if both the deps layer and the consuming layer are sync.\n */\nfunction layerProvide<DepsROut, DepsE, DepsRIn, DepsSync extends boolean>(\n deps: LayerType<DepsROut, DepsE, DepsRIn, DepsSync>,\n): {\n <ROut, E, RIn extends DepsROut, LayerSync extends boolean>(\n layer: LayerType<ROut, E, RIn, LayerSync>,\n ): LayerType<ROut | DepsROut, E | DepsE, DepsRIn, LayerSync extends true ? DepsSync : false>\n}\nfunction layerProvide<DepsROut, DepsE, DepsRIn>(deps: LayerType<DepsROut, DepsE, DepsRIn, boolean>) {\n return <ROut, E, RIn extends DepsROut>(\n layer: LayerType<ROut, E, RIn, boolean>,\n ): LayerType<ROut | DepsROut, E | DepsE, DepsRIn, boolean> => ({\n _tag: \"Layer\",\n _ROut: undefined as unknown as ROut | DepsROut,\n _E: undefined as unknown as E | DepsE,\n _RIn: undefined as unknown as DepsRIn,\n _Sync: undefined as unknown as boolean,\n build: (memoMap, scope): RunnableFx<Context<ROut | DepsROut>, E | DepsE, DepsRIn> => {\n const depsBuildFx = deps.build(memoMap, scope)\n\n if (depsBuildFx._tag === \"AsyncFx\") {\n return {\n _tag: \"AsyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as Context<ROut | DepsROut>,\n _E: () => undefined as unknown as E | DepsE,\n _R: () => undefined as unknown as DepsRIn,\n },\n async *[Symbol.asyncIterator](): AsyncGenerator<\n FxYield<E | DepsE, DepsRIn>,\n Context<ROut | DepsROut>,\n unknown\n > {\n const depsGen = depsBuildFx[Symbol.asyncIterator]()\n let depsResult = await depsGen.next()\n while (!depsResult.done) {\n const value = yield depsResult.value\n // oxlint-disable-next-line no-await-in-loop\n depsResult = await depsGen.next(value)\n }\n const depsCtx = depsResult.value\n\n const layerBuildFx = layer.build(memoMap, scope)\n if (layerBuildFx._tag === \"AsyncFx\") {\n const layerGen = layerBuildFx[Symbol.asyncIterator]()\n let layerResult = await layerGen.next()\n while (!layerResult.done) {\n const yielded = layerResult.value\n if (isServiceClass(yielded)) {\n const service = depsCtx._services.get(yielded.key)\n if (service !== undefined) {\n // oxlint-disable-next-line no-await-in-loop\n layerResult = await layerGen.next(service)\n continue\n }\n }\n const value = yield yielded as FxYield<E, DepsRIn>\n // oxlint-disable-next-line no-await-in-loop\n layerResult = await layerGen.next(value)\n }\n return Context.merge(depsCtx, layerResult.value)\n }\n\n const layerGen = layerBuildFx[Symbol.iterator]()\n let layerResult = layerGen.next()\n while (!layerResult.done) {\n const yielded = layerResult.value\n if (isServiceClass(yielded)) {\n const service = depsCtx._services.get(yielded.key)\n if (service !== undefined) {\n layerResult = layerGen.next(service)\n continue\n }\n }\n const value = yield yielded as FxYield<E, DepsRIn>\n layerResult = layerGen.next(value)\n }\n return Context.merge(depsCtx, layerResult.value)\n },\n } as AsyncFx<Context<ROut | DepsROut>, E | DepsE, DepsRIn>\n }\n\n return {\n _tag: \"SyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as Context<ROut | DepsROut>,\n _E: () => undefined as unknown as E | DepsE,\n _R: () => undefined as unknown as DepsRIn,\n },\n *[Symbol.iterator](): Generator<FxYield<E | DepsE, DepsRIn>, Context<ROut | DepsROut>, unknown> {\n const depsGen = depsBuildFx[Symbol.iterator]()\n let depsResult = depsGen.next()\n while (!depsResult.done) {\n const value = yield depsResult.value\n depsResult = depsGen.next(value)\n }\n const depsCtx = depsResult.value\n\n const layerBuildFx = layer.build(memoMap, scope)\n if (layerBuildFx._tag === \"SyncFx\") {\n const syncGen = layerBuildFx[Symbol.iterator]()\n let layerResult = syncGen.next()\n while (!layerResult.done) {\n const yielded = layerResult.value\n if (isServiceClass(yielded)) {\n const service = depsCtx._services.get(yielded.key)\n if (service !== undefined) {\n layerResult = syncGen.next(service)\n continue\n }\n }\n const value = yield yielded as FxYield<E, DepsRIn>\n layerResult = syncGen.next(value)\n }\n return Context.merge(depsCtx, layerResult.value)\n }\n throw new Error(\"Cannot use async layer in sync context\")\n },\n } as SyncFx<Context<ROut | DepsROut>, E | DepsE, DepsRIn>\n },\n })\n}\n\n/**\n * Merge multiple layers with automatic dependency resolution.\n * The merged layer is sync only if ALL input layers are sync.\n */\nfunction layerMerge<L extends LayerType<unknown, unknown, unknown, boolean>[]>(\n ...layers: L\n): LayerType<MergeROut<L>, MergeError<L>, UnprovidedDeps<L>, AllSync<L>>\nfunction layerMerge<L extends LayerType<unknown, unknown, unknown, boolean>[]>(\n ...layers: L\n): LayerType<MergeROut<L>, MergeError<L>, UnprovidedDeps<L>, boolean> {\n return {\n _tag: \"Layer\",\n _ROut: undefined as unknown as MergeROut<L>,\n _E: undefined as unknown as MergeError<L>,\n _RIn: undefined as unknown as UnprovidedDeps<L>,\n _Sync: undefined as unknown as boolean,\n build: (memoMap, scope): RunnableFx<Context<MergeROut<L>>, MergeError<L>, UnprovidedDeps<L>> => {\n const hasAsync = layers.some((l) => l.build(memoMap, scope)._tag === \"AsyncFx\")\n\n if (hasAsync) {\n return {\n _tag: \"AsyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as Context<MergeROut<L>>,\n _E: () => undefined as unknown as MergeError<L>,\n _R: () => undefined as unknown as UnprovidedDeps<L>,\n },\n async *[Symbol.asyncIterator](): AsyncGenerator<\n FxYield<MergeError<L>, UnprovidedDeps<L>>,\n Context<MergeROut<L>>,\n unknown\n > {\n let ctx = Context.empty() as Context<unknown>\n for (const layer of layers) {\n const buildFx = layer.build(memoMap, scope)\n if (buildFx._tag === \"AsyncFx\") {\n const gen = buildFx[Symbol.asyncIterator]()\n // oxlint-disable-next-line no-await-in-loop\n let result = await gen.next()\n while (!result.done) {\n const yielded = result.value\n if (isServiceClass(yielded)) {\n const service = ctx._services.get(yielded.key)\n if (service !== undefined) {\n // oxlint-disable-next-line no-await-in-loop\n result = await gen.next(service)\n continue\n }\n }\n const value = yield yielded as FxYield<MergeError<L>, UnprovidedDeps<L>>\n // oxlint-disable-next-line no-await-in-loop\n result = await gen.next(value)\n }\n ctx = Context.merge(ctx, result.value)\n } else {\n const gen = buildFx[Symbol.iterator]()\n let result = gen.next()\n while (!result.done) {\n const yielded = result.value\n if (isServiceClass(yielded)) {\n const service = ctx._services.get(yielded.key)\n if (service !== undefined) {\n result = gen.next(service)\n continue\n }\n }\n const value = yield yielded as FxYield<MergeError<L>, UnprovidedDeps<L>>\n result = gen.next(value)\n }\n ctx = Context.merge(ctx, result.value)\n }\n }\n return ctx as Context<MergeROut<L>>\n },\n } as AsyncFx<Context<MergeROut<L>>, MergeError<L>, UnprovidedDeps<L>>\n }\n\n return {\n _tag: \"SyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as Context<MergeROut<L>>,\n _E: () => undefined as unknown as MergeError<L>,\n _R: () => undefined as unknown as UnprovidedDeps<L>,\n },\n *[Symbol.iterator](): Generator<FxYield<MergeError<L>, UnprovidedDeps<L>>, Context<MergeROut<L>>, unknown> {\n let ctx = Context.empty() as Context<unknown>\n for (const layer of layers) {\n const buildFx = layer.build(memoMap, scope)\n if (buildFx._tag !== \"SyncFx\") {\n throw new Error(\"Expected sync layer in sync context\")\n }\n const gen = buildFx[Symbol.iterator]()\n let result = gen.next()\n while (!result.done) {\n const yielded = result.value\n if (isServiceClass(yielded)) {\n const service = ctx._services.get(yielded.key)\n if (service !== undefined) {\n result = gen.next(service)\n continue\n }\n }\n const value = yield yielded as FxYield<MergeError<L>, UnprovidedDeps<L>>\n result = gen.next(value)\n }\n ctx = Context.merge(ctx, result.value)\n }\n return ctx as Context<MergeROut<L>>\n },\n } as SyncFx<Context<MergeROut<L>>, MergeError<L>, UnprovidedDeps<L>>\n },\n }\n}\n\n// ============================================================================\n// Layer Namespace\n// ============================================================================\n\nexport const Layer = {\n ok: layerOk,\n err: layerErr,\n fx: layerFx,\n scoped: layerScoped,\n provide: layerProvide,\n merge: layerMerge,\n} as const\n","import type { Result } from \"../result/result.types\"\nimport { runSync, runAsync } from \"./fx\"\nimport { FxTypeId } from \"./fx.types\"\nimport type { SyncFx, AsyncFx, FxYield } from \"./fx.types\"\nimport { Service } from \"./service\"\n\n// ============================================================================\n// Scope Service\n// ============================================================================\n\n/**\n * Scope manages resource lifecycles with finalizers.\n * Finalizers run in LIFO (Last In, First Out) order when the scope closes.\n *\n * @example\n * ```ts\n * const DatabaseLive = Layer.scoped(Database)(\n * Fx.gen(function* () {\n * const scope = yield* Scope\n *\n * const connection = createConnection()\n *\n * // Register cleanup - runs when scope closes\n * yield* scope.addFinalizer(() =>\n * Fx.gen(function* () {\n * connection.close()\n * })\n * )\n *\n * return { query: (sql) => connection.query(sql) }\n * })\n * )\n * ```\n */\nexport type ScopeService = {\n /**\n * Add a finalizer to be run when the scope closes.\n * Finalizers are run in LIFO order.\n *\n * @param finalizer - A function that returns an Fx to run on cleanup\n * @returns An Fx that completes when the finalizer is registered\n */\n addFinalizer(finalizer: () => SyncFx<void> | AsyncFx<void>): SyncFx<void>\n\n /**\n * Close the scope, running all finalizers in LIFO order.\n *\n * @param exit - The exit status of the computation\n * @returns An Fx that completes when all finalizers have run\n */\n close(exit: Result<unknown, unknown>): SyncFx<void> | AsyncFx<void>\n\n /**\n * Fork a child scope.\n * The child scope will be closed when the parent scope closes.\n *\n * @returns A new child scope\n */\n fork(): ScopeService\n}\n\n// Create the Scope service tag\nclass ScopeTag extends Service<ScopeService>()(\"@std/Scope\") {}\nexport { ScopeTag as Scope }\n\n// ============================================================================\n// Scope Implementation\n// ============================================================================\n\n/**\n * Create a new Scope instance.\n * This is the concrete implementation of the ScopeService interface.\n */\nexport function createScope(): ScopeService {\n type Finalizer = () => SyncFx<void> | AsyncFx<void>\n const finalizers: Finalizer[] = []\n let closed = false\n const children: ScopeService[] = []\n\n const scope: ScopeService = {\n addFinalizer(finalizer: Finalizer): SyncFx<void> {\n return {\n _tag: \"SyncFx\",\n [FxTypeId]: {\n _A: () => undefined as void,\n _E: () => undefined as never,\n _R: () => undefined as never,\n },\n // oxlint-disable-next-line require-yield\n *[Symbol.iterator](): Generator<FxYield<never, never>, void, unknown> {\n if (!closed) {\n finalizers.push(finalizer)\n }\n },\n } as SyncFx<void>\n },\n\n close(exit: Result<unknown, unknown>): SyncFx<void> | AsyncFx<void> {\n // Check if any finalizer is async\n const hasAsyncFinalizer = finalizers.some((f) => {\n const fx = f()\n return fx._tag === \"AsyncFx\"\n })\n\n if (hasAsyncFinalizer) {\n return {\n _tag: \"AsyncFx\",\n [FxTypeId]: {\n _A: () => undefined as void,\n _E: () => undefined as never,\n _R: () => undefined as never,\n },\n // oxlint-disable-next-line require-yield\n async *[Symbol.asyncIterator](): AsyncGenerator<FxYield<never, never>, void, unknown> {\n if (closed) return\n closed = true\n\n // Close children first\n for (const child of [...children].toReversed()) {\n const childClose = child.close(exit)\n if (childClose._tag === \"AsyncFx\") {\n // oxlint-disable-next-line no-await-in-loop\n await runAsync(childClose)\n } else {\n runSync(childClose)\n }\n }\n\n // Run finalizers in LIFO order\n const reversed = [...finalizers].toReversed()\n for (const finalizer of reversed) {\n const fx = finalizer()\n if (fx._tag === \"AsyncFx\") {\n // oxlint-disable-next-line no-await-in-loop\n await runAsync(fx)\n } else {\n runSync(fx)\n }\n }\n },\n } as AsyncFx<void>\n }\n\n // Sync version\n return {\n _tag: \"SyncFx\",\n [FxTypeId]: {\n _A: () => undefined as void,\n _E: () => undefined as never,\n _R: () => undefined as never,\n },\n // oxlint-disable-next-line require-yield\n *[Symbol.iterator](): Generator<FxYield<never, never>, void, unknown> {\n if (closed) return\n closed = true\n\n // Close children first\n for (const child of [...children].toReversed()) {\n const childClose = child.close(exit)\n runSync(childClose as SyncFx<void>)\n }\n\n // Run finalizers in LIFO order\n const reversed = [...finalizers].toReversed()\n for (const finalizer of reversed) {\n const fx = finalizer()\n runSync(fx as SyncFx<void>)\n }\n },\n } as SyncFx<void>\n },\n\n fork(): ScopeService {\n const child = createScope()\n children.push(child)\n return child\n },\n }\n\n return scope\n}\n\n// ============================================================================\n// Helper Types\n// ============================================================================\n\n/**\n * Type utility to exclude Scope from requirements.\n * Used by Layer.scoped to auto-provide Scope.\n */\nexport type ExcludeScope<R> = Exclude<R, ScopeService>\n","import { ok } from \"../result/result\"\nimport type { Context } from \"./context\"\nimport { FxTypeId } from \"./fx.types\"\nimport type { RunnableFx, SyncFx, AsyncFx, FxYield } from \"./fx.types\"\nimport type { Layer } from \"./layer.types\"\nimport type { ScopeService } from \"./scope\"\nimport { isServiceClass } from \"./service\"\n\n// ============================================================================\n// MemoMap\n// ============================================================================\n\ntype AnyLayer = Layer<unknown, unknown, unknown>\n\n/**\n * MemoMap caches built layers so each layer is only built once.\n * Multiple dependents share the same service instance.\n *\n * This implements the \"service singleton\" pattern where a service\n * is instantiated once and shared across all consumers.\n *\n * @example\n * ```ts\n * // Database is built once, shared by DocumentService and TeamService\n * const AppLayer = Layer.merge(\n * ConfigLive,\n * LoggerLive,\n * DatabaseLive, // Built once\n * DocumentServiceLive, // Uses shared Database\n * TeamServiceLive, // Uses same Database instance\n * )\n * ```\n */\nexport class MemoMap {\n private cache = new Map<\n AnyLayer,\n {\n promise?: Promise<Context<unknown>>\n context?: Context<unknown>\n building?: boolean\n }\n >()\n\n /**\n * Get a cached context or build the layer if not cached.\n *\n * @param layer - The layer to get or build\n * @param scope - The scope for resource management\n * @param deps - Context containing the layer's dependencies\n * @returns A RunnableFx producing the layer's context\n */\n getOrBuild<ROut, E, RIn>(\n layer: Layer<ROut, E, RIn>,\n scope: ScopeService,\n deps: Context<RIn>,\n ): RunnableFx<Context<ROut>, E> {\n const cached = this.cache.get(layer as AnyLayer)\n\n // Already built - return cached context\n if (cached?.context) {\n return {\n _tag: \"SyncFx\",\n [FxTypeId]: {\n _A: () => cached.context as Context<ROut>,\n _E: () => undefined as unknown as E,\n _R: () => undefined as never,\n },\n run: () => ok(cached.context as Context<ROut>),\n // oxlint-disable-next-line require-yield\n *[Symbol.iterator](): Generator<FxYield<E, never>, Context<ROut>, unknown> {\n return cached.context as Context<ROut>\n },\n } as SyncFx<Context<ROut>, E>\n }\n\n // Building in progress (async) - wait for it\n if (cached?.promise) {\n return {\n _tag: \"AsyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as Context<ROut>,\n _E: () => undefined as unknown as E,\n _R: () => undefined as never,\n },\n run: async () => {\n const ctx = await cached.promise!\n return ok(ctx as Context<ROut>)\n },\n // oxlint-disable-next-line require-yield\n async *[Symbol.asyncIterator](): AsyncGenerator<FxYield<E, never>, Context<ROut>, unknown> {\n const ctx = await cached.promise!\n return ctx as Context<ROut>\n },\n } as AsyncFx<Context<ROut>, E>\n }\n\n // Need to build - mark as building\n this.cache.set(layer as AnyLayer, { building: true })\n\n // Build the layer with provided dependencies\n const buildFx = layer.build(this, scope)\n const cacheRef = this.cache\n\n // Determine if async\n if (buildFx._tag === \"AsyncFx\") {\n // Create a promise for the build\n const buildPromise = (async () => {\n const gen = buildFx[Symbol.asyncIterator]()\n let result = await gen.next()\n\n // Resolve service requests from deps\n while (!result.done) {\n const yielded = result.value\n if (isServiceClass(yielded)) {\n const service = deps._services.get(yielded.key)\n if (service === undefined) {\n throw new Error(`Service \"${yielded.key}\" not found during layer build`)\n }\n // oxlint-disable-next-line no-await-in-loop\n result = await gen.next(service)\n } else {\n // It's an error - rethrow\n throw yielded\n }\n }\n\n const ctx = result.value\n cacheRef.set(layer as AnyLayer, { context: ctx })\n return ctx\n })()\n\n this.cache.set(layer as AnyLayer, { promise: buildPromise })\n\n return {\n _tag: \"AsyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as Context<ROut>,\n _E: () => undefined as unknown as E,\n _R: () => undefined as never,\n },\n run: async () => {\n try {\n const ctx = await buildPromise\n return ok(ctx)\n } catch (e) {\n return {\n ok: false,\n error: e as E,\n *[Symbol.iterator]() {\n yield e as E\n throw new Error(\"Unreachable\")\n },\n }\n }\n },\n async *[Symbol.asyncIterator](): AsyncGenerator<FxYield<E, never>, Context<ROut>, unknown> {\n try {\n const ctx = await buildPromise\n return ctx\n } catch (e) {\n yield e as E\n throw new Error(\"Unreachable\", { cause: e })\n }\n },\n } as AsyncFx<Context<ROut>, E>\n }\n\n // Sync build\n return {\n _tag: \"SyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as Context<ROut>,\n _E: () => undefined as unknown as E,\n _R: () => undefined as never,\n },\n run: () => {\n const gen = buildFx[Symbol.iterator]()\n let result = gen.next()\n\n // Resolve service requests from deps\n while (!result.done) {\n const yielded = result.value\n if (isServiceClass(yielded)) {\n const service = deps._services.get(yielded.key)\n if (service === undefined) {\n throw new Error(`Service \"${yielded.key}\" not found during layer build`)\n }\n result = gen.next(service)\n } else {\n // It's an error\n return {\n ok: false,\n error: yielded as E,\n *[Symbol.iterator]() {\n yield yielded as E\n throw new Error(\"Unreachable\")\n },\n }\n }\n }\n\n const ctx = result.value\n cacheRef.set(layer as AnyLayer, { context: ctx })\n return ok(ctx)\n },\n *[Symbol.iterator](): Generator<FxYield<E, never>, Context<ROut>, unknown> {\n const gen = buildFx[Symbol.iterator]()\n let result = gen.next()\n\n // Resolve service requests from deps\n while (!result.done) {\n const yielded = result.value\n if (isServiceClass(yielded)) {\n const service = deps._services.get(yielded.key)\n if (service === undefined) {\n throw new Error(`Service \"${yielded.key}\" not found during layer build`)\n }\n result = gen.next(service)\n } else {\n // It's an error - yield it\n yield yielded as E\n throw new Error(\"Unreachable\")\n }\n }\n\n cacheRef.set(layer as AnyLayer, { context: result.value })\n return result.value\n },\n } as SyncFx<Context<ROut>, E>\n }\n\n /**\n * Clear the cache.\n * Useful for testing.\n */\n clear(): void {\n this.cache.clear()\n }\n\n /**\n * Get the number of cached layers.\n */\n get size(): number {\n return this.cache.size\n }\n}\n\n/**\n * Create a new MemoMap instance.\n */\nexport const createMemoMap = (): MemoMap => new MemoMap()\n","import { ok } from \"../result/result\"\nimport type { Context } from \"./context\"\nimport { runSync, runAsync } from \"./fx\"\nimport { FxTypeId } from \"./fx.types\"\nimport type { RunnableFx, SyncFx, AsyncFx, FxYield } from \"./fx.types\"\nimport type { Layer } from \"./layer.types\"\nimport { MemoMap } from \"./memo-map\"\nimport { createScope } from \"./scope\"\nimport { isServiceClass } from \"./service\"\nimport type { ServiceClass } from \"./service\"\n\n// ============================================================================\n// Provide Layer\n// ============================================================================\n\n/**\n * Extract the value type from an Fx.\n */\ntype FxValueType<F> = F extends RunnableFx<infer A, unknown, unknown> ? A : never\n\n/**\n * Extract the error type from an Fx.\n */\ntype FxErrorType<F> = F extends RunnableFx<unknown, infer E, unknown> ? E : never\n\n/**\n * Type for the result of provide based on layer sync and fx type.\n * Uses infer to extract A and E from the actual Fx type.\n * - Sync layer + SyncFx → SyncFx\n * - Sync layer + AsyncFx → AsyncFx\n * - Async layer + any fx → AsyncFx\n * - Unknown sync layer + any fx → RunnableFx (fallback)\n */\ntype ProvideResult<\n E2,\n LayerSync extends boolean,\n Fx extends RunnableFx<unknown, unknown, unknown>,\n> = LayerSync extends true\n ? Fx[\"_tag\"] extends \"SyncFx\"\n ? SyncFx<FxValueType<Fx>, FxErrorType<Fx> | E2>\n : AsyncFx<FxValueType<Fx>, FxErrorType<Fx> | E2>\n : LayerSync extends false\n ? AsyncFx<FxValueType<Fx>, FxErrorType<Fx> | E2>\n : RunnableFx<FxValueType<Fx>, FxErrorType<Fx> | E2>\n\n/**\n * Provide a layer to an Fx computation, resolving all service requirements.\n * Creates a new scope for resource management.\n *\n * Type preservation:\n * - Sync layer + SyncFx → SyncFx\n * - Sync layer + AsyncFx → AsyncFx\n * - Async layer + any fx → AsyncFx\n * - Unknown sync layer + any fx → RunnableFx (fallback)\n *\n * @param layer - The layer providing services (must have no external requirements)\n * @returns A function that takes an Fx and returns an Fx with dependencies resolved\n *\n * @example\n * ```ts\n * const result = Fx.run(pipe(\n * updateDocumentWorkflow(userId, docId, data),\n * provide(AppLayer)\n * ))\n * ```\n */\nexport function provide<ROut, E2, LayerSync extends boolean>(\n layer: Layer<ROut, E2, never, LayerSync>,\n): <Fx extends RunnableFx<unknown, unknown, ROut>>(fx: Fx) => ProvideResult<E2, LayerSync, Fx>\nexport function provide<ROut, E2>(layer: Layer<ROut, E2>) {\n return <A, E, R extends ROut>(fx: RunnableFx<A, E, R>): RunnableFx<A, E | E2> => {\n // Determine if the layer or fx is async\n const memoMap = new MemoMap()\n const scope = createScope()\n const layerBuildFx = layer.build(memoMap, scope)\n\n if (layerBuildFx._tag === \"AsyncFx\" || fx._tag === \"AsyncFx\") {\n return {\n _tag: \"AsyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as A,\n _E: () => undefined as unknown as E | E2,\n _R: () => undefined as never,\n },\n async *[Symbol.asyncIterator](): AsyncGenerator<FxYield<E | E2, Exclude<R, ROut>>, A, unknown> {\n try {\n // Build the layer\n let ctx: Context<ROut>\n\n if (layerBuildFx._tag === \"AsyncFx\") {\n const gen = layerBuildFx[Symbol.asyncIterator]()\n let result = await gen.next()\n\n while (!result.done) {\n yield result.value as E2\n // oxlint-disable-next-line no-await-in-loop\n result = await gen.next(undefined)\n }\n ctx = result.value\n } else {\n const gen = layerBuildFx[Symbol.iterator]()\n let result = gen.next()\n\n while (!result.done) {\n yield result.value as E2\n result = gen.next(undefined)\n }\n ctx = result.value\n }\n\n // Run the fx with the context\n if (fx._tag === \"AsyncFx\") {\n const fxGen = fx[Symbol.asyncIterator]()\n let fxResult = await fxGen.next()\n\n while (!fxResult.done) {\n const yielded = fxResult.value\n\n if (isServiceClass(yielded)) {\n const service = ctx._services.get(yielded.key)\n if (service !== undefined) {\n // oxlint-disable-next-line no-await-in-loop\n fxResult = await fxGen.next(service)\n continue\n }\n }\n\n // Pass through (error or unsatisfied service)\n const value = yield yielded as FxYield<E, Exclude<R, ROut>>\n // oxlint-disable-next-line no-await-in-loop\n fxResult = await fxGen.next(value)\n }\n\n return fxResult.value\n }\n\n // Sync fx\n const fxGen = fx[Symbol.iterator]()\n let fxResult = fxGen.next()\n\n while (!fxResult.done) {\n const yielded = fxResult.value\n if (isServiceClass(yielded)) {\n const service = ctx._services.get(yielded.key)\n if (service !== undefined) {\n fxResult = fxGen.next(service)\n continue\n }\n }\n\n const value = yield yielded as FxYield<E, Exclude<R, ROut>>\n fxResult = fxGen.next(value)\n }\n\n return fxResult.value\n } finally {\n const closeResult = scope.close(ok(undefined))\n if (closeResult._tag === \"AsyncFx\") {\n await runAsync(closeResult)\n } else {\n runSync(closeResult)\n }\n }\n },\n } as AsyncFx<A, E | E2>\n }\n\n // Both sync\n return {\n _tag: \"SyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as A,\n _E: () => undefined as unknown as E | E2,\n _R: () => undefined as never,\n },\n *[Symbol.iterator](): Generator<FxYield<E | E2, Exclude<R, ROut>>, A, unknown> {\n try {\n // Build the layer\n const layerGen = layerBuildFx[Symbol.iterator]()\n let layerResult = layerGen.next()\n\n while (!layerResult.done) {\n yield layerResult.value as E2\n layerResult = layerGen.next(undefined)\n }\n\n const ctx = layerResult.value\n\n // Run the fx with the context\n const fxGen = fx[Symbol.iterator]()\n let fxResult = fxGen.next()\n\n while (!fxResult.done) {\n const yielded = fxResult.value\n if (isServiceClass(yielded)) {\n const service = ctx._services.get(yielded.key)\n if (service !== undefined) {\n fxResult = fxGen.next(service)\n continue\n }\n }\n const value = yield yielded as FxYield<E, Exclude<R, ROut>>\n fxResult = fxGen.next(value)\n }\n\n return fxResult.value\n } finally {\n const closeResult = scope.close(ok(undefined))\n // In sync-only branch, closeResult is always SyncFx\n runSync(closeResult as SyncFx<void, never>)\n }\n },\n } as SyncFx<A, E | E2>\n }\n}\n\n// ============================================================================\n// Provide Context\n// ============================================================================\n\n/**\n * Provide a context directly to an Fx computation.\n *\n * @param ctx - The context containing services\n * @returns A function that takes an Fx and returns an Fx with dependencies resolved\n *\n * @example\n * ```ts\n * const ctx = Context.make(Config, configImpl)\n * const result = Fx.run(pipe(\n * myWorkflow,\n * provideContext(ctx)\n * ))\n * ```\n */\nexport const provideContext =\n <R>(ctx: Context<R>) =>\n <A, E>(fx: RunnableFx<A, E, R>): RunnableFx<A, E> => {\n if (fx._tag === \"AsyncFx\") {\n return {\n _tag: \"AsyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as A,\n _E: () => undefined as unknown as E,\n _R: () => undefined as never,\n },\n async *[Symbol.asyncIterator](): AsyncGenerator<FxYield<E, never>, A, unknown> {\n const gen = fx[Symbol.asyncIterator]()\n let result = await gen.next()\n\n while (!result.done) {\n const yielded = result.value\n if (isServiceClass(yielded)) {\n const service = ctx._services.get(yielded.key)\n if (service === undefined) {\n throw new Error(`Service \"${yielded.key}\" not found`)\n }\n // oxlint-disable-next-line no-await-in-loop\n result = await gen.next(service)\n } else {\n yield yielded as E\n // oxlint-disable-next-line no-await-in-loop\n result = await gen.next(undefined)\n }\n }\n\n return result.value\n },\n } as AsyncFx<A, E>\n }\n\n return {\n _tag: \"SyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as A,\n _E: () => undefined as unknown as E,\n _R: () => undefined as never,\n },\n *[Symbol.iterator](): Generator<FxYield<E, never>, A, unknown> {\n const gen = fx[Symbol.iterator]()\n let result = gen.next()\n\n while (!result.done) {\n const yielded = result.value\n if (isServiceClass(yielded)) {\n const service = ctx._services.get(yielded.key)\n if (service === undefined) {\n throw new Error(`Service \"${yielded.key}\" not found`)\n }\n result = gen.next(service)\n } else {\n yield yielded as E\n result = gen.next(undefined)\n }\n }\n\n return result.value\n },\n } as SyncFx<A, E>\n }\n\n// ============================================================================\n// Provide Service\n// ============================================================================\n\n/**\n * Provide a single service to an Fx computation.\n *\n * @param service - The service class (tag)\n * @param impl - The service implementation\n * @returns A function that takes an Fx and returns an Fx with the service provided\n *\n * @example\n * ```ts\n * const result = Fx.run(pipe(\n * myWorkflow,\n * provideService(Config, configImpl),\n * provideService(Logger, loggerImpl),\n * ))\n * ```\n */\nexport const provideService =\n <S>(service: ServiceClass<S>, impl: S) =>\n <A, E, R>(fx: RunnableFx<A, E, R | S>): RunnableFx<A, E, Exclude<R, S>> => {\n if (fx._tag === \"AsyncFx\") {\n return {\n _tag: \"AsyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as A,\n _E: () => undefined as unknown as E,\n _R: () => undefined as unknown as Exclude<R, S>,\n },\n async *[Symbol.asyncIterator](): AsyncGenerator<FxYield<E, Exclude<R, S>>, A, unknown> {\n const gen = fx[Symbol.asyncIterator]()\n let result = await gen.next()\n\n while (!result.done) {\n const yielded = result.value\n if (isServiceClass(yielded) && yielded.key === service.key) {\n // oxlint-disable-next-line no-await-in-loop\n result = await gen.next(impl)\n } else {\n const value = yield yielded as FxYield<E, Exclude<R, S>>\n // oxlint-disable-next-line no-await-in-loop\n result = await gen.next(value)\n }\n }\n\n return result.value\n },\n } as AsyncFx<A, E, Exclude<R, S>>\n }\n\n return {\n _tag: \"SyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as A,\n _E: () => undefined as unknown as E,\n _R: () => undefined as unknown as Exclude<R, S>,\n },\n *[Symbol.iterator](): Generator<FxYield<E, Exclude<R, S>>, A, unknown> {\n const gen = fx[Symbol.iterator]()\n let result = gen.next()\n\n while (!result.done) {\n const yielded = result.value\n if (isServiceClass(yielded) && yielded.key === service.key) {\n result = gen.next(impl)\n } else {\n const value = yield yielded as FxYield<E, Exclude<R, S>>\n result = gen.next(value)\n }\n }\n\n return result.value\n },\n } as SyncFx<A, E, Exclude<R, S>>\n }\n"],"mappings":"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"}
1
+ {"version":3,"file":"fx-C4UuWCqP.mjs","names":["ok","err","isServiceClass","exitDefect","exitErr","exitOk","gen","resultOk","resultErr","service","impl","ctx","gen","layerGen","layerResult","ok","gen","gen","fxGen","fxResult","ok"],"sources":["../src/fx/exit.ts","../src/fx/fx.ts","../src/fx/service.ts","../src/fx/context.ts","../src/fx/layer.ts","../src/fx/scope.ts","../src/fx/memo-map.ts","../src/fx/provide.ts"],"sourcesContent":["import { dual } from \"../shared/dual\"\nimport type { Err, Ok } from \"../shared/type-utils.types\"\n\n// ============================================================================\n// Exit Types - Flat 3-variant discriminated union\n// ============================================================================\n\n/**\n * Represents an unexpected thrown exception (defect) caught during Fx execution.\n */\nexport type Defect = {\n readonly _tag: \"Defect\"\n readonly defect: unknown\n}\n\n/**\n * Exit represents the outcome of an Fx computation.\n * A flat 3-variant discriminated union that cleanly separates:\n * - `Ok<A>`: successful result with value of type A\n * - `Err<E>`: typed failure with error of type E\n * - `Defect`: unexpected thrown exception (defect)\n *\n * @example\n * ```ts\n * const exit = Fx.run(computation)\n * switch (exit._tag) {\n * case \"Ok\": exit.value // A\n * case \"Err\": exit.error // E (clean!)\n * case \"Defect\": exit.defect // unknown\n * }\n * ```\n */\nexport type Exit<A, E> = Ok<A> | Err<E> | Defect\n\n// ============================================================================\n// Constructors\n// ============================================================================\n\n/**\n * Create a successful Exit.\n */\nexport const ok = <A>(value: A): Ok<A> => ({ _tag: \"Ok\", value })\n\n/**\n * Create a typed failure Exit.\n */\nexport const err = <E>(error: E): Err<E> => ({ _tag: \"Err\", error })\n\n/**\n * Create a defect Exit from an unexpected thrown value.\n */\nexport const defect = (thrown: unknown): Defect => ({ _tag: \"Defect\", defect: thrown })\n\n// ============================================================================\n// Guards\n// ============================================================================\n\n/**\n * Check if an Exit is a successful result.\n */\nconst isOk = <A, E>(exit: Exit<A, E>): exit is Ok<A> => exit._tag === \"Ok\"\n\n/**\n * Check if an Exit is a typed failure.\n */\nconst isErr = <A, E>(exit: Exit<A, E>): exit is Err<E> => exit._tag === \"Err\"\n\n/**\n * Check if an Exit is an unexpected defect.\n */\nconst isDefect = <A, E>(exit: Exit<A, E>): exit is Defect => exit._tag === \"Defect\"\n\n// ============================================================================\n// Match\n// ============================================================================\n\n/**\n * Handler functions for Exit.match.\n */\ntype ExitMatch<A, E, R> = {\n readonly Ok: (value: A) => R\n readonly Err: (error: E) => R\n readonly Defect: (defect: unknown) => R\n}\n\n/**\n * Pattern match on an Exit value.\n *\n * @example\n * ```ts\n * // Data-first\n * Exit.match(exit, {\n * Ok: (value) => `Success: ${value}`,\n * Err: (error) => `Error: ${error}`,\n * Defect: (defect) => `Defect: ${defect}`,\n * })\n *\n * // Data-last (pipe)\n * pipe(exit, Exit.match({\n * Ok: (value) => `Success: ${value}`,\n * Err: (error) => `Error: ${error}`,\n * Defect: (defect) => `Defect: ${defect}`,\n * }))\n * ```\n */\nconst match: {\n <A, E, R>(exit: Exit<A, E>, handlers: ExitMatch<A, E, R>): R\n <A, E, R>(handlers: ExitMatch<A, E, R>): (exit: Exit<A, E>) => R\n} = dual(2, <A, E, R>(exit: Exit<A, E>, handlers: ExitMatch<A, E, R>): R => {\n switch (exit._tag) {\n case \"Ok\":\n return handlers.Ok(exit.value)\n case \"Err\":\n return handlers.Err(exit.error)\n case \"Defect\":\n return handlers.Defect(exit.defect)\n }\n})\n\n// ============================================================================\n// Utility\n// ============================================================================\n\n/**\n * Extract the value from an Ok exit, or throw.\n * Useful for tests and scripts where you expect success.\n *\n * @throws The error for Err exits, or the defect for Defect exits\n */\nconst getOrThrow = <A, E>(exit: Exit<A, E>): A => {\n switch (exit._tag) {\n case \"Ok\":\n return exit.value\n case \"Err\":\n throw exit.error\n case \"Defect\":\n throw exit.defect\n }\n}\n\n// ============================================================================\n// Namespace\n// ============================================================================\n\n/**\n * Exit namespace containing all Exit utilities.\n */\nexport const Exit = {\n ok,\n err,\n defect,\n isOk,\n isErr,\n isDefect,\n match,\n getOrThrow,\n} as const\n","import { NoSuchElementError } from \"../option/option.types\"\nimport { ok as resultOk, err as resultErr } from \"../result/result\"\nimport { dual } from \"../shared/dual\"\nimport { ok as exitOk, err as exitErr, defect as exitDefect } from \"./exit\"\nimport type { Exit } from \"./exit\"\nimport { FxTypeId } from \"./fx.types\"\nimport type { RunnableFx, SyncFx, AsyncFx, Fx as FxProtocol, FxError, FxRequirements } from \"./fx.types\"\n\n// ============================================================================\n// Fx.run - Execute computations\n// ============================================================================\n\n/**\n * Execute a sync Fx computation and return the Exit.\n * Catches unexpected thrown exceptions and wraps them as Defect.\n * Only available when R = never (all dependencies provided).\n *\n * @param fx - The sync computation to execute\n * @returns Exit<A, E>\n */\nfunction fxRun<A, E>(fx: SyncFx<A, E>): Exit<A, E>\n\n/**\n * Execute an async Fx computation and return a Promise of the Exit.\n * Catches unexpected thrown exceptions and wraps them as Defect.\n * Only available when R = never (all dependencies provided).\n *\n * @param fx - The async computation to execute\n * @returns Promise<Exit<A, E>>\n */\nfunction fxRun<A, E>(fx: AsyncFx<A, E>): Promise<Exit<A, E>>\n\n/**\n * Execute an Fx computation (union type).\n * Returns Exit for sync, Promise<Exit> for async.\n * Catches unexpected thrown exceptions and wraps them as Defect.\n */\nfunction fxRun<A, E>(fx: RunnableFx<A, E>): Exit<A, E> | Promise<Exit<A, E>>\n\n/**\n * Implementation of Fx.run.\n * Detects sync vs async and executes appropriately.\n */\nfunction fxRun<A, E>(fx: RunnableFx<A, E>): Exit<A, E> | Promise<Exit<A, E>> {\n if (fx._tag === \"AsyncFx\") {\n return runAsync(fx)\n }\n return runSync(fx)\n}\n\n/**\n * Check if a value is a ServiceClass (yielded for service injection).\n */\nfunction isServiceClass(value: unknown): value is { _tag: \"Service\"; key: string } {\n return typeof value === \"object\" && value !== null && \"_tag\" in value && value._tag === \"Service\"\n}\n\n/**\n * Internal helper to run a sync Fx computation.\n * Wraps execution in try-catch to capture unexpected thrown exceptions as Defect.\n */\nfunction runSync<A, E>(fx: SyncFx<A, E>): Exit<A, E> {\n try {\n const gen = fx[Symbol.iterator]()\n const result = gen.next()\n\n if (result.done !== true) {\n const yielded = result.value as unknown\n // Check for ServiceClass (which is what gets yielded now)\n if (isServiceClass(yielded)) {\n return exitDefect(new Error(`Service \"${yielded.key}\" not provided. Use provide() to inject services.`))\n }\n // Check for NoSuchElementError (from Option.none())\n if (yielded instanceof NoSuchElementError) {\n return exitErr(yielded as E)\n }\n // Check for Result.err - extract the error field\n if (typeof yielded === \"object\" && yielded !== null && \"_tag\" in yielded && yielded._tag === \"Err\") {\n /* oxlint-disable no-unsafe-type-assertion -- extracting error from Result with _tag Err */\n return exitErr((yielded as Record<string, unknown>)[\"error\"] as E)\n /* oxlint-enable no-unsafe-type-assertion */\n }\n // Otherwise it's a raw error (shouldn't happen with proper types, but handle for safety)\n return exitErr(yielded as E)\n }\n\n return exitOk(result.value)\n } catch (thrown) {\n return exitDefect(thrown)\n }\n}\n\n/**\n * Internal helper to run an async Fx computation.\n * Wraps execution in try-catch to capture unexpected thrown exceptions as Defect.\n */\nasync function runAsync<A, E>(fx: AsyncFx<A, E>): Promise<Exit<A, E>> {\n try {\n const gen = fx[Symbol.asyncIterator]()\n const result = await gen.next()\n\n if (result.done !== true) {\n const yielded = result.value as unknown\n // Check for ServiceClass (which is what gets yielded now)\n if (isServiceClass(yielded)) {\n return exitDefect(new Error(`Service \"${yielded.key}\" not provided. Use provide() to inject services.`))\n }\n // Check for NoSuchElementError (from Option.none())\n if (yielded instanceof NoSuchElementError) {\n return exitErr(yielded as E)\n }\n // Check for Result.err - extract the error field\n if (typeof yielded === \"object\" && yielded !== null && \"_tag\" in yielded && yielded._tag === \"Err\") {\n /* oxlint-disable no-unsafe-type-assertion -- extracting error from Result with _tag Err */\n return exitErr((yielded as Record<string, unknown>)[\"error\"] as E)\n /* oxlint-enable no-unsafe-type-assertion */\n }\n // Otherwise it's a raw error (shouldn't happen with proper types, but handle for safety)\n return exitErr(yielded as E)\n }\n\n return exitOk(result.value)\n } catch (thrown) {\n return exitDefect(thrown)\n }\n}\n\n// ============================================================================\n// Fx.gen - Create composable computations\n// ============================================================================\n\n/**\n * Create a composable computation from a sync generator function.\n * Returns a SyncFx that can be stored, passed around, and executed later.\n *\n * @template Yielded - The type of values yielded by the generator (must implement Fx protocol)\n * @template A - The success value type\n * @param generatorFn - A function that returns a sync generator\n * @returns SyncFx<A, FxError<Yielded>, FxRequirements<Yielded>>\n *\n * @example\n * ```ts\n * const getUser = (id: string) => Fx.gen(function* () {\n * const db = yield* Database\n * const logger = yield* Logger\n *\n * logger.info(`Fetching user ${id}`)\n * return yield* db.query<User>(`SELECT * FROM users WHERE id = '${id}'`)\n * })\n * // Type: SyncFx<User[], DatabaseError, Database | Logger>\n *\n * // Execute later with dependencies provided\n * const exit = pipe(getUser(\"123\"), provide(AppLayer)).run()\n * ```\n */\nfunction fxGen<Yielded extends FxProtocol<unknown, unknown, unknown>, A>(\n generatorFn: () => Generator<Yielded, A, unknown>,\n): SyncFx<A, FxError<Yielded>, FxRequirements<Yielded>>\n\n/**\n * Create a composable computation from an async generator function.\n * Returns an AsyncFx that can be stored, passed around, and executed later.\n *\n * @template Yielded - The type of values yielded by the generator (must implement Fx protocol)\n * @template A - The success value type\n * @param generatorFn - A function that returns an async generator\n * @returns AsyncFx<A, FxError<Yielded>, FxRequirements<Yielded>>\n *\n * @example\n * ```ts\n * const fetchData = (url: string) => Fx.gen(async function* () {\n * const logger = yield* Logger\n *\n * logger.info(`Fetching ${url}`)\n * const response = await fetch(url)\n * return yield* Result.fromTry(async () => await response.json())\n * })\n * // Type: AsyncFx<unknown, Error, Logger>\n * ```\n */\nfunction fxGen<Yielded extends FxProtocol<unknown, unknown, unknown>, A>(\n generatorFn: () => AsyncGenerator<Yielded, A, unknown>,\n): AsyncFx<A, FxError<Yielded>, FxRequirements<Yielded>>\n\n/**\n * Create a composable computation from a sync generator function that takes parameters.\n * Returns a factory function that, when called with parameters, produces a SyncFx.\n *\n * @template P - The parameter types (must be non-empty)\n * @template Yielded - The type of values yielded by the generator (must implement Fx protocol)\n * @template A - The success value type\n * @param generatorFn - A function that takes parameters and returns a sync generator\n * @returns A factory function that produces SyncFx<A, FxError<Yielded>, FxRequirements<Yielded>>\n *\n * @example\n * ```ts\n * const getUser = Fx.gen(function* ({userId}: {userId: string}) {\n * const db = yield* Database\n * return yield* db.query(`SELECT * FROM users WHERE id = '${userId}'`)\n * })\n * // Type: (params: {userId: string}) => SyncFx<...>\n *\n * const exit = Fx.run(pipe(getUser({userId: \"123\"}), provide(DbLayer)))\n * ```\n */\nfunction fxGen<P extends [unknown, ...unknown[]], Yielded extends FxProtocol<unknown, unknown, unknown>, A>(\n generatorFn: (...params: P) => Generator<Yielded, A, unknown>,\n): (...params: P) => SyncFx<A, FxError<Yielded>, FxRequirements<Yielded>>\n\n/**\n * Create a composable computation from an async generator function that takes parameters.\n * Returns a factory function that, when called with parameters, produces an AsyncFx.\n *\n * @template P - The parameter types (must be non-empty)\n * @template Yielded - The type of values yielded by the generator (must implement Fx protocol)\n * @template A - The success value type\n * @param generatorFn - A function that takes parameters and returns an async generator\n * @returns A factory function that produces AsyncFx<A, FxError<Yielded>, FxRequirements<Yielded>>\n *\n * @example\n * ```ts\n * const fetchUser = Fx.gen(async function* ({url}: {url: string}) {\n * const response = await fetch(url)\n * return yield* Result.fromTry(async () => await response.json())\n * })\n * // Type: (params: {url: string}) => AsyncFx<...>\n * ```\n */\nfunction fxGen<P extends [unknown, ...unknown[]], Yielded extends FxProtocol<unknown, unknown, unknown>, A>(\n generatorFn: (...params: P) => AsyncGenerator<Yielded, A, unknown>,\n): (...params: P) => AsyncFx<A, FxError<Yielded>, FxRequirements<Yielded>>\n\n/**\n * Implementation of unified Fx.gen function.\n * Detects sync vs async generator and returns appropriate computation type.\n * For parameterized generators (length > 0), returns a factory function.\n */\n// oxlint-disable-next-line no-explicit-any\nfunction fxGen(generatorFn: (...args: any[]) => any): any {\n if (generatorFn.length > 0) {\n return (...params: unknown[]) => fxGen(() => generatorFn(...params))\n }\n\n // Check if we're dealing with async generator\n const testGen = generatorFn()\n const isAsync = Symbol.asyncIterator in testGen\n\n if (isAsync) {\n return {\n _tag: \"AsyncFx\",\n [FxTypeId]: {\n _A: () => undefined,\n _E: () => undefined,\n _R: () => undefined,\n },\n // oxlint-disable-next-line no-explicit-any\n async *[Symbol.asyncIterator](): AsyncGenerator<any, any, unknown> {\n const gen = generatorFn()\n let result = await gen.next()\n\n while (!result.done) {\n // Pass through yields (errors or services as Fx values)\n const injected = yield result.value\n // oxlint-disable-next-line no-await-in-loop\n result = await gen.next(injected)\n }\n\n return result.value\n },\n }\n }\n\n // Sync generator\n return {\n _tag: \"SyncFx\",\n [FxTypeId]: {\n _A: () => undefined,\n _E: () => undefined,\n _R: () => undefined,\n },\n // oxlint-disable-next-line no-explicit-any\n *[Symbol.iterator](): Generator<any, any, unknown> {\n const gen = generatorFn()\n let result = gen.next()\n\n while (!result.done) {\n const injected = yield result.value\n result = gen.next(injected)\n }\n\n return result.value\n },\n }\n}\n\n// ============================================================================\n// Fx.fn - Execute computations immediately\n// ============================================================================\n\n/**\n * Execute a sync computation immediately and return the Exit.\n * Catches unexpected thrown exceptions and wraps them as Defect.\n * Infers A, E, and R types from yielded Fx values (same as Fx.gen).\n *\n * @template Yielded - The type of values yielded by the generator (must implement Fx protocol)\n * @template A - The success value type\n * @param generatorFn - A function that returns a sync generator\n * @returns Exit<A, FxError<Yielded>>\n *\n * @example\n * ```ts\n * const exit = Fx.fn(function* () {\n * const a = yield* Result.ok(10)\n * const b = yield* Result.ok(20)\n * return a + b\n * })\n * // Type: Exit<number, never>\n * // exit = { _tag: \"Ok\", value: 30 }\n * ```\n */\nfunction fxFn<Yielded extends FxProtocol<unknown, unknown, unknown>, A>(\n generatorFn: () => Generator<Yielded, A, unknown>,\n): Exit<A, FxError<Yielded>>\n\n/**\n * Execute an async computation immediately and return a Promise of the Exit.\n * Catches unexpected thrown exceptions and wraps them as Defect.\n * Infers A, E, and R types from yielded Fx values (same as Fx.gen).\n *\n * @template Yielded - The type of values yielded by the generator (must implement Fx protocol)\n * @template A - The success value type\n * @param generatorFn - A function that returns an async generator\n * @returns Promise<Exit<A, FxError<Yielded>>>\n *\n * @example\n * ```ts\n * const exit = await Fx.fn(async function* () {\n * const response = await fetch(\"/api/users\")\n * const data = yield* Result.fromTry(async () => await response.json())\n * return data\n * })\n * // Type: Promise<Exit<unknown, Error>>\n * ```\n */\nfunction fxFn<Yielded extends FxProtocol<unknown, unknown, unknown>, A>(\n generatorFn: () => AsyncGenerator<Yielded, A, unknown>,\n): Promise<Exit<A, FxError<Yielded>>>\n\n/**\n * Execute a sync computation with service dependencies immediately.\n * Catches unexpected thrown exceptions and wraps them as Defect.\n * The second argument is required when the computation has service requirements (R ≠ never).\n * Infers A, E, and R types from yielded Fx values (same as Fx.gen).\n *\n * @template Yielded - The type of values yielded by the generator (must implement Fx protocol)\n * @template A - The success value type\n * @template E2 - The error type from the provider (layer)\n * @param generatorFn - A function that returns a sync generator with service requirements\n * @param provider - A function that provides the services (e.g., provide(AppLayer))\n * @returns Exit<A, FxError<Yielded> | E2>\n *\n * @example\n * ```ts\n * const exit = Fx.fn(function* () {\n * const config = yield* Config\n * const logger = yield* Logger\n * logger.info(`DB URL: ${config.dbUrl}`)\n * return config.dbUrl\n * }, provide(AppLayer))\n * // Type: Exit<string, never>\n * ```\n */\nfunction fxFn<Yielded extends FxProtocol<unknown, unknown, unknown>, A, E2>(\n generatorFn: () => Generator<Yielded, A, unknown>,\n provider: (fx: RunnableFx<A, FxError<Yielded>, FxRequirements<Yielded>>) => RunnableFx<A, FxError<Yielded> | E2>,\n): Exit<A, FxError<Yielded> | E2>\n\n/**\n * Execute an async computation with service dependencies immediately.\n * Catches unexpected thrown exceptions and wraps them as Defect.\n * The second argument is required when the computation has service requirements (R ≠ never).\n * Infers A, E, and R types from yielded Fx values (same as Fx.gen).\n *\n * @template Yielded - The type of values yielded by the generator (must implement Fx protocol)\n * @template A - The success value type\n * @template E2 - The error type from the provider (layer)\n * @param generatorFn - A function that returns an async generator with service requirements\n * @param provider - A function that provides the services (e.g., provide(AppLayer))\n * @returns Promise<Exit<A, FxError<Yielded> | E2>>\n *\n * @example\n * ```ts\n * const exit = await Fx.fn(async function* () {\n * const config = yield* Config\n * await doAsyncWork()\n * return config.dbUrl\n * }, provide(AppLayer))\n * // Type: Promise<Exit<string, never>>\n * ```\n */\nfunction fxFn<Yielded extends FxProtocol<unknown, unknown, unknown>, A, E2>(\n generatorFn: () => AsyncGenerator<Yielded, A, unknown>,\n provider: (fx: RunnableFx<A, FxError<Yielded>, FxRequirements<Yielded>>) => RunnableFx<A, FxError<Yielded> | E2>,\n): Promise<Exit<A, FxError<Yielded> | E2>>\n\n/**\n * Implementation of Fx.fn.\n * Reuses fxGen() for Fx creation and fxRun() for execution to ensure consistent behavior.\n */\n// oxlint-disable-next-line no-explicit-any\nfunction fxFn<Yielded extends FxProtocol<unknown, unknown, unknown>, A, E2>(\n generatorFn: () => Generator<Yielded, A, unknown> | AsyncGenerator<Yielded, A, unknown>,\n provider?: (fx: RunnableFx<A, FxError<Yielded>, FxRequirements<Yielded>>) => RunnableFx<A, FxError<Yielded> | E2>,\n): Exit<A, FxError<Yielded> | E2> | Promise<Exit<A, FxError<Yielded> | E2>> {\n // Create the Fx using fxGen (single source of truth for Fx creation)\n // Type cast needed because fxGen infers E/R from yielded Fx values\n // oxlint-disable-next-line no-explicit-any\n const fx = fxGen(generatorFn as any) as RunnableFx<A, FxError<Yielded>, FxRequirements<Yielded>>\n\n if (provider) {\n // Apply provider and run\n const provided = provider(fx)\n return fxRun(provided as RunnableFx<A, FxError<Yielded> | E2>) as\n | Exit<A, FxError<Yielded> | E2>\n | Promise<Exit<A, FxError<Yielded> | E2>>\n }\n\n // No provider - run directly (R must be never at the type level)\n return fxRun(fx as RunnableFx<A, FxError<Yielded> | E2>) as\n | Exit<A, FxError<Yielded> | E2>\n | Promise<Exit<A, FxError<Yielded> | E2>>\n}\n\n// ============================================================================\n// Fx.ok / Fx.err - Convenience aliases\n// ============================================================================\n\n/**\n * Convenience alias for Result.ok.\n * Creates a successful Result that can be yielded in an Fx computation.\n *\n * @param value - The success value\n * @returns Result<T, never>\n *\n * @example\n * ```ts\n * const workflow = Fx.gen(function* () {\n * const value = yield* Fx.ok(42)\n * return value * 2\n * })\n * ```\n */\nconst fxOk = resultOk\n\n/**\n * Convenience alias for Result.err.\n * Creates an error Result that can be yielded in an Fx computation.\n *\n * @param error - The error value\n * @returns Result<never, E>\n *\n * @example\n * ```ts\n * const workflow = Fx.gen(function* () {\n * const config = yield* Config\n *\n * if (!config.dbUrl) {\n * return yield* Fx.err(new ValidationError({ field: \"dbUrl\" }))\n * }\n *\n * return config.dbUrl\n * })\n * ```\n */\nconst fxErr = resultErr\n\n// ============================================================================\n// Fx.match - Universal pattern matching\n// ============================================================================\n\n/**\n * Handler functions for matching on a tagged union by `_tag` discriminator.\n * Each handler receives the narrowed variant corresponding to its tag key.\n */\nexport type TaggedMatch<T extends { readonly _tag: string }, R> = {\n readonly [K in T[\"_tag\"]]: (variant: Extract<T, { readonly _tag: K }>) => R\n}\n\n/**\n * Generic pattern matcher for any `_tag`-based discriminated union.\n *\n * Works with Exit, tagged errors, or any type with a `readonly _tag` discriminator.\n * Each handler receives the full narrowed variant object for its tag.\n *\n * Supports both data-first and data-last (pipe) calling styles.\n *\n * @example\n * ```ts\n * // Match on Exit\n * Fx.match(exit, {\n * Ok: (ok) => ok.value,\n * Err: (err) =>\n * Fx.match(err.error, {\n * DatabaseError: (e) => e.message,\n * NotFoundError: (e) => e.resourceId,\n * }),\n * Defect: (d) => String(d.defect),\n * })\n *\n * // Data-last with pipe\n * pipe(exit, Fx.match({\n * Ok: (ok) => ok.value,\n * Err: (err) => \"error\",\n * Defect: (d) => \"defect\",\n * }))\n * ```\n */\nconst fxMatch: {\n <T extends { readonly _tag: string }, R>(value: T, handlers: TaggedMatch<T, R>): R\n <T extends { readonly _tag: string }, R>(handlers: TaggedMatch<T, R>): (value: T) => R\n} = dual(\n 2,\n // oxlint-disable-next-line no-explicit-any\n (value: any, handlers: any): any => handlers[value._tag](value),\n)\n\n// ============================================================================\n// Exports\n// ============================================================================\n\n// Export individual functions\nexport const gen = fxGen\nexport const fn = fxFn\nexport const run = fxRun\nexport const ok = fxOk\nexport const err = fxErr\nexport { fxMatch as match }\n\n// Export internal helpers for use in other modules (provide, scope)\nexport { runSync, runAsync }\n\n/**\n * Fx namespace containing utilities for creating and running effectful computations.\n *\n * Fx provides a minimal API inspired by Effect.ts:\n * - `Fx.gen()` - Create composable computations with service dependencies\n * - `Fx.fn()` - Execute computations immediately\n * - `Fx.run()` - Execute a computation (when all dependencies are provided)\n * - `Fx.ok()` - Create successful results (alias for Result.ok)\n * - `Fx.err()` - Create error results (alias for Result.err)\n *\n * @example\n * ```ts\n * import { Fx, Service, Layer, provide, pipe, Exit } from \"@repo/std\"\n *\n * // Define services\n * class Config extends Service<Config>()(\"Config\") {\n * readonly dbUrl!: string\n * }\n *\n * class Logger extends Service<Logger>()(\"Logger\") {\n * readonly info!: (msg: string) => void\n * }\n *\n * // Create layers\n * const ConfigLive = Layer.ok(Config, { dbUrl: \"postgres://...\" })\n * const LoggerLive = Layer.fx(Logger)(\n * Fx.gen(function* () {\n * const config = yield* Config\n * return { info: (msg) => console.log(`[${config.dbUrl}] ${msg}`) }\n * })\n * )\n *\n * // Create workflow\n * const myWorkflow = Fx.gen(function* () {\n * const logger = yield* Logger\n * logger.info(\"Hello from Fx!\")\n * return \"done\"\n * })\n *\n * // Compose and run\n * const AppLayer = pipe(ConfigLive, Layer.provide(LoggerLive))\n * const exit = Fx.run(pipe(myWorkflow, provide(AppLayer)))\n * // exit._tag === \"Ok\" | \"Err\" | \"Defect\"\n * ```\n */\nexport const Fx = {\n gen: fxGen,\n fn: fxFn,\n run: fxRun,\n ok: fxOk,\n err: fxErr,\n match: fxMatch,\n} as const\n","import { FxTypeId } from \"./fx.types\"\nimport type { Fx } from \"./fx.types\"\n\n// ============================================================================\n// Service Class Types\n// ============================================================================\n\n/**\n * The interface returned by Service()().\n * Acts as both a type tag and a runtime lookup key.\n * Implements Fx protocol with E = never (no errors) and R = Self (requires itself).\n * When yielded, yields itself (as Fx) for proper type inference.\n */\nexport type ServiceClass<Self, Key extends string = string> = Fx<Self, never, Self> & {\n readonly _tag: \"Service\"\n readonly key: Key\n // Phantom type\n readonly _Self: Self\n\n /**\n * Yielding the service class in a gen computation\n * returns the service instance from context.\n * Yields the ServiceClass itself (which implements Fx) for type inference.\n */\n [Symbol.iterator](): Generator<ServiceClass<Self, Key>, Self, unknown>\n}\n\n/**\n * Extract the service type from a ServiceClass.\n */\nexport type ServiceOf<T> = T extends ServiceClass<infer S> ? S : never\n\n/**\n * Extract the key from a ServiceClass.\n */\nexport type ServiceKey<T> = T extends ServiceClass<unknown, infer K> ? K : never\n\n// ============================================================================\n// Service Factory\n// ============================================================================\n\n/**\n * Define a service with a unique key.\n * The returned class acts as both a type and a runtime tag for lookup.\n *\n * Usage follows a double-invocation pattern:\n * - First call provides the Self type parameter\n * - Second call provides the unique key\n *\n * @example\n * ```ts\n * class Config extends Service<Config>()(\"Config\") {\n * readonly dbUrl!: string\n * readonly logLevel!: \"debug\" | \"info\" | \"error\"\n * }\n *\n * class Logger extends Service<Logger>()(\"Logger\") {\n * readonly info!: (msg: string) => void\n * readonly error!: (msg: string) => void\n * }\n *\n * // Use in Fx.gen:\n * const workflow = Fx.gen(function* () {\n * const config = yield* Config\n * const logger = yield* Logger\n * logger.info(`DB URL: ${config.dbUrl}`)\n * })\n * ```\n */\nexport function Service<Self>(): <Key extends string>(key: Key) => ServiceClass<Self, Key> & (new () => Self) {\n return <Key extends string>(key: Key): ServiceClass<Self, Key> & (new () => Self) => {\n // Create the base class with proper prototype\n // oxlint-disable-next-line typescript/no-extraneous-class\n const ServiceBase = class {\n static readonly _tag = \"Service\" as const\n static readonly key: Key = key\n static readonly _Self: Self = undefined as unknown as Self\n\n static readonly [FxTypeId] = {\n _A: () => undefined as unknown as Self,\n _E: () => undefined as never,\n _R: () => undefined as unknown as Self,\n };\n\n /**\n * Yielding the class returns the class itself (for type inference).\n * The runtime intercepts this and provides the actual service instance.\n */\n static *[Symbol.iterator](): Generator<typeof ServiceBase, Self, Self> {\n // Yield the class itself - it implements Fx<Self, never, Self>\n // The runtime will recognize ServiceClass and inject the service\n const serviceInstance = yield ServiceBase\n return serviceInstance\n }\n }\n\n // Return with correct typing\n return ServiceBase as unknown as ServiceClass<Self, Key> & (new () => Self)\n }\n}\n\n/**\n * Create a service tag without class syntax.\n * Useful for simple services that don't need class inheritance.\n *\n * @example\n * ```ts\n * interface ConfigService {\n * readonly dbUrl: string\n * readonly logLevel: \"debug\" | \"info\" | \"error\"\n * }\n *\n * const Config = serviceTag<ConfigService>(\"Config\")\n *\n * // Use in Fx.gen:\n * const workflow = Fx.gen(function* () {\n * const config = yield* Config\n * console.log(config.dbUrl)\n * })\n * ```\n */\nexport function serviceTag<S>(key: string): ServiceClass<S> {\n const tag: ServiceClass<S> = {\n _tag: \"Service\",\n key,\n _Self: undefined as unknown as S,\n [FxTypeId]: {\n _A: () => undefined as unknown as S,\n _E: () => undefined as never,\n _R: () => undefined as unknown as S,\n },\n *[Symbol.iterator](): Generator<ServiceClass<S>, S, S> {\n // Yield the tag itself - it implements Fx<S, never, S>\n // The runtime will recognize ServiceClass and inject the service\n const serviceInstance = yield tag\n return serviceInstance\n },\n }\n return tag\n}\n\n/**\n * Check if a value is a ServiceClass.\n */\nexport const isServiceClass = (value: unknown): value is ServiceClass<unknown> =>\n typeof value === \"object\" && value !== null && \"_tag\" in value && value._tag === \"Service\" && \"key\" in value\n","import type { ServiceClass } from \"./service\"\n\n// ============================================================================\n// Context Type\n// ============================================================================\n\n/**\n * Context<Services> is an immutable map storing service implementations.\n * The Services type parameter tracks which services are available.\n */\nexport type Context<Services = never> = {\n readonly _tag: \"Context\"\n readonly _services: ReadonlyMap<string, unknown>\n // Phantom type for tracking available services\n readonly _Services: Services\n}\n\n// ============================================================================\n// Context Constructors\n// ============================================================================\n\n/**\n * Create an empty context with no services.\n */\nconst empty = (): Context => ({\n _tag: \"Context\",\n _services: new Map(),\n _Services: undefined as never,\n})\n\n/**\n * Create a context with a single service.\n *\n * @param service - The service class (tag)\n * @param impl - The service implementation\n * @returns A context containing the service\n *\n * @example\n * ```ts\n * const ctx = Context.make(Config, { dbUrl: \"postgres://...\", logLevel: \"info\" })\n * ```\n */\nconst make = <S>(service: ServiceClass<S>, impl: S): Context<S> => ({\n _tag: \"Context\",\n _services: new Map([[service.key, impl]]),\n _Services: undefined as unknown as S,\n})\n\n// ============================================================================\n// Context Operations\n// ============================================================================\n\n/**\n * Add a service to an existing context (returns new context).\n * Curried for use with pipe.\n *\n * @param service - The service class (tag)\n * @param impl - The service implementation\n * @returns A function that takes a context and returns a new context with the service added\n *\n * @example\n * ```ts\n * const ctx = pipe(\n * Context.empty(),\n * Context.add(Config, configImpl),\n * Context.add(Logger, loggerImpl),\n * )\n * ```\n */\nconst add =\n <S>(service: ServiceClass<S>, impl: S) =>\n <Existing>(ctx: Context<Existing>): Context<Existing | S> => ({\n _tag: \"Context\",\n _services: new Map([...ctx._services, [service.key, impl]]),\n _Services: undefined as unknown as Existing | S,\n })\n\n/**\n * Merge two contexts together.\n * If both contexts have the same service, the second context's implementation wins.\n *\n * @param a - First context\n * @param b - Second context\n * @returns A new context with services from both\n *\n * @example\n * ```ts\n * const ctx = Context.merge(configContext, loggerContext)\n * ```\n */\nconst merge = <A, B>(a: Context<A>, b: Context<B>): Context<A | B> => ({\n _tag: \"Context\",\n _services: new Map([...a._services, ...b._services]),\n _Services: undefined as unknown as A | B,\n})\n\n/**\n * Get a service from a context.\n * Throws if the service is not found.\n *\n * @param service - The service class (tag)\n * @returns The service implementation\n * @throws Error if service not found\n *\n * @example\n * ```ts\n * const config = Context.get(ctx, Config)\n * ```\n */\n// Use overload to handle both curried and uncurried calls\nfunction get<S>(ctx: Context<S>, service: ServiceClass<S>): S\nfunction get<S>(service: ServiceClass<S>): (ctx: Context<S>) => S\nfunction get<S>(\n ctxOrService: Context<S> | ServiceClass<S>,\n maybeService?: ServiceClass<S>,\n): S | ((ctx: Context<S>) => S) {\n // Curried form: get(service)(ctx)\n if (maybeService === undefined) {\n const service = ctxOrService as ServiceClass<S>\n return (ctx: Context<S>): S => {\n const impl = ctx._services.get(service.key)\n if (impl === undefined) {\n throw new Error(\n `Service \"${service.key}\" not found in context. Available services: [${[...ctx._services.keys()].join(\", \")}]`,\n )\n }\n return impl as S\n }\n }\n\n // Uncurried form: get(ctx, service)\n const ctx = ctxOrService as Context<S>\n const service = maybeService\n const impl = ctx._services.get(service.key)\n if (impl === undefined) {\n throw new Error(\n `Service \"${service.key}\" not found in context. Available services: [${[...ctx._services.keys()].join(\", \")}]`,\n )\n }\n return impl as S\n}\n\n/**\n * Unsafely get a service from a context by key string.\n * Used internally by the runtime when resolving ServiceRequests.\n * Returns undefined if not found (caller should handle).\n */\nconst unsafeGet = (ctx: Context<unknown>, key: string): unknown => ctx._services.get(key)\n\n/**\n * Check if a context contains a specific service.\n *\n * @param ctx - The context to check\n * @param service - The service class (tag)\n * @returns true if the service is in the context\n */\nconst has = <S>(ctx: Context<unknown>, service: ServiceClass<S>): boolean => ctx._services.has(service.key)\n\n/**\n * Get all service keys in a context.\n */\nconst keys = (ctx: Context<unknown>): string[] => [...ctx._services.keys()]\n\n/**\n * Get the size (number of services) in a context.\n */\nconst size = (ctx: Context<unknown>): number => ctx._services.size\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Check if a value is a Context.\n */\nconst isContext = (value: unknown): value is Context<unknown> =>\n typeof value === \"object\" && value !== null && \"_tag\" in value && value._tag === \"Context\"\n\n// ============================================================================\n// Context Namespace\n// ============================================================================\n\n/**\n * Context namespace containing utilities for managing service contexts.\n *\n * A Context is an immutable map of services that can be provided to Fx computations.\n * Services are identified by their unique keys.\n *\n * @example\n * ```ts\n * import { Context, Service } from \"@repo/std\"\n *\n * class Config extends Service<Config>()(\"Config\") {\n * readonly dbUrl!: string\n * }\n *\n * class Logger extends Service<Logger>()(\"Logger\") {\n * readonly info!: (msg: string) => void\n * }\n *\n * // Create a context with services\n * const ctx = pipe(\n * Context.empty(),\n * Context.add(Config, { dbUrl: \"postgres://...\" }),\n * Context.add(Logger, { info: console.log }),\n * )\n *\n * // Or use make and merge\n * const configCtx = Context.make(Config, { dbUrl: \"postgres://...\" })\n * const loggerCtx = Context.make(Logger, { info: console.log })\n * const fullCtx = Context.merge(configCtx, loggerCtx)\n * ```\n */\nexport const Context = {\n empty,\n make,\n add,\n merge,\n get,\n unsafeGet,\n has,\n keys,\n size,\n isContext,\n} as const\n","import { Context } from \"./context\"\nimport { FxTypeId } from \"./fx.types\"\nimport type { RunnableFx, SyncFx, AsyncFx, FxYield } from \"./fx.types\"\nimport type { Layer as LayerType, MergeROut, MergeError, UnprovidedDeps, AllSync } from \"./layer.types\"\nimport type { ScopeService, ExcludeScope } from \"./scope\"\nimport { isServiceClass } from \"./service\"\nimport type { ServiceClass } from \"./service\"\n\n/**\n * Create a layer from a synchronous value (no dependencies).\n */\nconst layerOk = <S>(service: ServiceClass<S>, impl: S): LayerType<S, never, never, true> => ({\n _tag: \"Layer\",\n _ROut: undefined as unknown as S,\n _E: undefined as never,\n _RIn: undefined as never,\n _Sync: undefined as unknown as true,\n build: (): SyncFx<Context<S>, never> => ({\n _tag: \"SyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as Context<S>,\n _E: () => undefined as never,\n _R: () => undefined as never,\n },\n // oxlint-disable-next-line require-yield\n *[Symbol.iterator](): Generator<never, Context<S>, unknown> {\n return Context.make(service, impl)\n },\n }),\n})\n\n/**\n * Create a layer that always fails with an error.\n */\nconst layerErr = <E>(error: E): LayerType<never, E, never, true> => ({\n _tag: \"Layer\",\n _ROut: undefined as never,\n _E: undefined as unknown as E,\n _RIn: undefined as never,\n _Sync: undefined as unknown as true,\n build: (): SyncFx<Context, E> => ({\n _tag: \"SyncFx\",\n [FxTypeId]: {\n _A: () => undefined as never,\n _E: () => error,\n _R: () => undefined as never,\n },\n *[Symbol.iterator](): Generator<E, never, unknown> {\n yield error\n throw new Error(\"Unreachable\")\n },\n }),\n})\n\n/**\n * Create a layer from an Fx computation (can have dependencies).\n * The Sync type parameter is inferred from the input fx:\n * - SyncFx input → Layer with Sync=true\n * - AsyncFx input → Layer with Sync=false\n */\nfunction layerFx<S>(service: ServiceClass<S>): {\n <E, R>(fx: SyncFx<S, E, R>): LayerType<S, E, R, true>\n <E, R>(fx: AsyncFx<S, E, R>): LayerType<S, E, R, false>\n <E, R>(fx: RunnableFx<S, E, R>): LayerType<S, E, R, boolean>\n}\nfunction layerFx<S>(service: ServiceClass<S>) {\n return <E, R>(fx: RunnableFx<S, E, R>): LayerType<S, E, R, boolean> => ({\n _tag: \"Layer\",\n _ROut: undefined as unknown as S,\n _E: undefined as unknown as E,\n _RIn: undefined as unknown as R,\n _Sync: undefined as unknown as boolean,\n build: (): RunnableFx<Context<S>, E, R> => {\n if (fx._tag === \"AsyncFx\") {\n return {\n _tag: \"AsyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as Context<S>,\n _E: () => undefined as unknown as E,\n _R: () => undefined as unknown as R,\n },\n async *[Symbol.asyncIterator](): AsyncGenerator<FxYield<E, R>, Context<S>, unknown> {\n const gen = fx[Symbol.asyncIterator]()\n let result = await gen.next()\n while (!result.done) {\n const value = yield result.value\n // oxlint-disable-next-line no-await-in-loop\n result = await gen.next(value)\n }\n return Context.make(service, result.value)\n },\n } as AsyncFx<Context<S>, E, R>\n }\n\n return {\n _tag: \"SyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as Context<S>,\n _E: () => undefined as unknown as E,\n _R: () => undefined as unknown as R,\n },\n *[Symbol.iterator](): Generator<FxYield<E, R>, Context<S>, unknown> {\n const gen = fx[Symbol.iterator]()\n let result = gen.next()\n while (!result.done) {\n const value = yield result.value\n result = gen.next(value)\n }\n return Context.make(service, result.value)\n },\n } as SyncFx<Context<S>, E, R>\n },\n })\n}\n\n/**\n * Create a scoped layer (with resource cleanup).\n * The Sync type parameter is inferred from the input fx.\n */\nfunction layerScoped<S>(service: ServiceClass<S>): {\n <E, R>(fx: SyncFx<S, E, R | ScopeService>): LayerType<S, E, ExcludeScope<R>, true>\n <E, R>(fx: AsyncFx<S, E, R | ScopeService>): LayerType<S, E, ExcludeScope<R>, false>\n <E, R>(fx: RunnableFx<S, E, R | ScopeService>): LayerType<S, E, ExcludeScope<R>, boolean>\n}\nfunction layerScoped<S>(service: ServiceClass<S>) {\n return <E, R>(fx: RunnableFx<S, E, R | ScopeService>): LayerType<S, E, ExcludeScope<R>, boolean> => ({\n _tag: \"Layer\",\n _ROut: undefined as unknown as S,\n _E: undefined as unknown as E,\n _RIn: undefined as unknown as ExcludeScope<R>,\n _Sync: undefined as unknown as boolean,\n build: (_memoMap, scope): RunnableFx<Context<S>, E, ExcludeScope<R>> => {\n if (fx._tag === \"AsyncFx\") {\n return {\n _tag: \"AsyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as Context<S>,\n _E: () => undefined as unknown as E,\n _R: () => undefined as unknown as ExcludeScope<R>,\n },\n async *[Symbol.asyncIterator](): AsyncGenerator<FxYield<E, ExcludeScope<R>>, Context<S>, unknown> {\n const gen = fx[Symbol.asyncIterator]()\n let result = await gen.next()\n while (!result.done) {\n const yielded = result.value\n if (isServiceClass(yielded) && yielded.key === \"@std/Scope\") {\n // oxlint-disable-next-line no-await-in-loop\n result = await gen.next(scope)\n } else {\n const value = yield yielded as FxYield<E, ExcludeScope<R>>\n // oxlint-disable-next-line no-await-in-loop\n result = await gen.next(value)\n }\n }\n return Context.make(service, result.value)\n },\n } as AsyncFx<Context<S>, E, ExcludeScope<R>>\n }\n\n return {\n _tag: \"SyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as Context<S>,\n _E: () => undefined as unknown as E,\n _R: () => undefined as unknown as ExcludeScope<R>,\n },\n *[Symbol.iterator](): Generator<FxYield<E, ExcludeScope<R>>, Context<S>, unknown> {\n const gen = fx[Symbol.iterator]()\n let result = gen.next()\n while (!result.done) {\n const yielded = result.value\n if (isServiceClass(yielded) && yielded.key === \"@std/Scope\") {\n result = gen.next(scope)\n } else {\n const value = yield yielded as FxYield<E, ExcludeScope<R>>\n result = gen.next(value)\n }\n }\n return Context.make(service, result.value)\n },\n } as SyncFx<Context<S>, E, ExcludeScope<R>>\n },\n })\n}\n\n// ============================================================================\n// Layer Composition\n// ============================================================================\n\n/**\n * Provide dependencies to a layer and merge outputs.\n * Sync is preserved only if both the deps layer and the consuming layer are sync.\n */\nfunction layerProvide<DepsROut, DepsE, DepsRIn, DepsSync extends boolean>(\n deps: LayerType<DepsROut, DepsE, DepsRIn, DepsSync>,\n): {\n <ROut, E, RIn extends DepsROut, LayerSync extends boolean>(\n layer: LayerType<ROut, E, RIn, LayerSync>,\n ): LayerType<ROut | DepsROut, E | DepsE, DepsRIn, LayerSync extends true ? DepsSync : false>\n}\nfunction layerProvide<DepsROut, DepsE, DepsRIn>(deps: LayerType<DepsROut, DepsE, DepsRIn, boolean>) {\n return <ROut, E, RIn extends DepsROut>(\n layer: LayerType<ROut, E, RIn, boolean>,\n ): LayerType<ROut | DepsROut, E | DepsE, DepsRIn, boolean> => ({\n _tag: \"Layer\",\n _ROut: undefined as unknown as ROut | DepsROut,\n _E: undefined as unknown as E | DepsE,\n _RIn: undefined as unknown as DepsRIn,\n _Sync: undefined as unknown as boolean,\n build: (memoMap, scope): RunnableFx<Context<ROut | DepsROut>, E | DepsE, DepsRIn> => {\n const depsBuildFx = deps.build(memoMap, scope)\n\n if (depsBuildFx._tag === \"AsyncFx\") {\n return {\n _tag: \"AsyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as Context<ROut | DepsROut>,\n _E: () => undefined as unknown as E | DepsE,\n _R: () => undefined as unknown as DepsRIn,\n },\n async *[Symbol.asyncIterator](): AsyncGenerator<\n FxYield<E | DepsE, DepsRIn>,\n Context<ROut | DepsROut>,\n unknown\n > {\n const depsGen = depsBuildFx[Symbol.asyncIterator]()\n let depsResult = await depsGen.next()\n while (!depsResult.done) {\n const value = yield depsResult.value\n // oxlint-disable-next-line no-await-in-loop\n depsResult = await depsGen.next(value)\n }\n const depsCtx = depsResult.value\n\n const layerBuildFx = layer.build(memoMap, scope)\n if (layerBuildFx._tag === \"AsyncFx\") {\n const layerGen = layerBuildFx[Symbol.asyncIterator]()\n let layerResult = await layerGen.next()\n while (!layerResult.done) {\n const yielded = layerResult.value\n if (isServiceClass(yielded)) {\n const service = depsCtx._services.get(yielded.key)\n if (service !== undefined) {\n // oxlint-disable-next-line no-await-in-loop\n layerResult = await layerGen.next(service)\n continue\n }\n }\n const value = yield yielded as FxYield<E, DepsRIn>\n // oxlint-disable-next-line no-await-in-loop\n layerResult = await layerGen.next(value)\n }\n return Context.merge(depsCtx, layerResult.value)\n }\n\n const layerGen = layerBuildFx[Symbol.iterator]()\n let layerResult = layerGen.next()\n while (!layerResult.done) {\n const yielded = layerResult.value\n if (isServiceClass(yielded)) {\n const service = depsCtx._services.get(yielded.key)\n if (service !== undefined) {\n layerResult = layerGen.next(service)\n continue\n }\n }\n const value = yield yielded as FxYield<E, DepsRIn>\n layerResult = layerGen.next(value)\n }\n return Context.merge(depsCtx, layerResult.value)\n },\n } as AsyncFx<Context<ROut | DepsROut>, E | DepsE, DepsRIn>\n }\n\n return {\n _tag: \"SyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as Context<ROut | DepsROut>,\n _E: () => undefined as unknown as E | DepsE,\n _R: () => undefined as unknown as DepsRIn,\n },\n *[Symbol.iterator](): Generator<FxYield<E | DepsE, DepsRIn>, Context<ROut | DepsROut>, unknown> {\n const depsGen = depsBuildFx[Symbol.iterator]()\n let depsResult = depsGen.next()\n while (!depsResult.done) {\n const value = yield depsResult.value\n depsResult = depsGen.next(value)\n }\n const depsCtx = depsResult.value\n\n const layerBuildFx = layer.build(memoMap, scope)\n if (layerBuildFx._tag === \"SyncFx\") {\n const syncGen = layerBuildFx[Symbol.iterator]()\n let layerResult = syncGen.next()\n while (!layerResult.done) {\n const yielded = layerResult.value\n if (isServiceClass(yielded)) {\n const service = depsCtx._services.get(yielded.key)\n if (service !== undefined) {\n layerResult = syncGen.next(service)\n continue\n }\n }\n const value = yield yielded as FxYield<E, DepsRIn>\n layerResult = syncGen.next(value)\n }\n return Context.merge(depsCtx, layerResult.value)\n }\n throw new Error(\"Cannot use async layer in sync context\")\n },\n } as SyncFx<Context<ROut | DepsROut>, E | DepsE, DepsRIn>\n },\n })\n}\n\n/**\n * Merge multiple layers with automatic dependency resolution.\n * The merged layer is sync only if ALL input layers are sync.\n */\nfunction layerMerge<L extends LayerType<unknown, unknown, unknown, boolean>[]>(\n ...layers: L\n): LayerType<MergeROut<L>, MergeError<L>, UnprovidedDeps<L>, AllSync<L>>\nfunction layerMerge<L extends LayerType<unknown, unknown, unknown, boolean>[]>(\n ...layers: L\n): LayerType<MergeROut<L>, MergeError<L>, UnprovidedDeps<L>, boolean> {\n return {\n _tag: \"Layer\",\n _ROut: undefined as unknown as MergeROut<L>,\n _E: undefined as unknown as MergeError<L>,\n _RIn: undefined as unknown as UnprovidedDeps<L>,\n _Sync: undefined as unknown as boolean,\n build: (memoMap, scope): RunnableFx<Context<MergeROut<L>>, MergeError<L>, UnprovidedDeps<L>> => {\n const hasAsync = layers.some((l) => l.build(memoMap, scope)._tag === \"AsyncFx\")\n\n if (hasAsync) {\n return {\n _tag: \"AsyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as Context<MergeROut<L>>,\n _E: () => undefined as unknown as MergeError<L>,\n _R: () => undefined as unknown as UnprovidedDeps<L>,\n },\n async *[Symbol.asyncIterator](): AsyncGenerator<\n FxYield<MergeError<L>, UnprovidedDeps<L>>,\n Context<MergeROut<L>>,\n unknown\n > {\n let ctx = Context.empty() as Context<unknown>\n for (const layer of layers) {\n const buildFx = layer.build(memoMap, scope)\n if (buildFx._tag === \"AsyncFx\") {\n const gen = buildFx[Symbol.asyncIterator]()\n // oxlint-disable-next-line no-await-in-loop\n let result = await gen.next()\n while (!result.done) {\n const yielded = result.value\n if (isServiceClass(yielded)) {\n const service = ctx._services.get(yielded.key)\n if (service !== undefined) {\n // oxlint-disable-next-line no-await-in-loop\n result = await gen.next(service)\n continue\n }\n }\n const value = yield yielded as FxYield<MergeError<L>, UnprovidedDeps<L>>\n // oxlint-disable-next-line no-await-in-loop\n result = await gen.next(value)\n }\n ctx = Context.merge(ctx, result.value)\n } else {\n const gen = buildFx[Symbol.iterator]()\n let result = gen.next()\n while (!result.done) {\n const yielded = result.value\n if (isServiceClass(yielded)) {\n const service = ctx._services.get(yielded.key)\n if (service !== undefined) {\n result = gen.next(service)\n continue\n }\n }\n const value = yield yielded as FxYield<MergeError<L>, UnprovidedDeps<L>>\n result = gen.next(value)\n }\n ctx = Context.merge(ctx, result.value)\n }\n }\n return ctx as Context<MergeROut<L>>\n },\n } as AsyncFx<Context<MergeROut<L>>, MergeError<L>, UnprovidedDeps<L>>\n }\n\n return {\n _tag: \"SyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as Context<MergeROut<L>>,\n _E: () => undefined as unknown as MergeError<L>,\n _R: () => undefined as unknown as UnprovidedDeps<L>,\n },\n *[Symbol.iterator](): Generator<FxYield<MergeError<L>, UnprovidedDeps<L>>, Context<MergeROut<L>>, unknown> {\n let ctx = Context.empty() as Context<unknown>\n for (const layer of layers) {\n const buildFx = layer.build(memoMap, scope)\n if (buildFx._tag !== \"SyncFx\") {\n throw new Error(\"Expected sync layer in sync context\")\n }\n const gen = buildFx[Symbol.iterator]()\n let result = gen.next()\n while (!result.done) {\n const yielded = result.value\n if (isServiceClass(yielded)) {\n const service = ctx._services.get(yielded.key)\n if (service !== undefined) {\n result = gen.next(service)\n continue\n }\n }\n const value = yield yielded as FxYield<MergeError<L>, UnprovidedDeps<L>>\n result = gen.next(value)\n }\n ctx = Context.merge(ctx, result.value)\n }\n return ctx as Context<MergeROut<L>>\n },\n } as SyncFx<Context<MergeROut<L>>, MergeError<L>, UnprovidedDeps<L>>\n },\n }\n}\n\n// ============================================================================\n// Layer Namespace\n// ============================================================================\n\nexport const Layer = {\n ok: layerOk,\n err: layerErr,\n fx: layerFx,\n scoped: layerScoped,\n provide: layerProvide,\n merge: layerMerge,\n} as const\n","import type { Result } from \"../result/result.types\"\nimport { runSync, runAsync } from \"./fx\"\nimport { FxTypeId } from \"./fx.types\"\nimport type { SyncFx, AsyncFx, FxYield } from \"./fx.types\"\nimport { Service } from \"./service\"\n\n// ============================================================================\n// Scope Service\n// ============================================================================\n\n/**\n * Scope manages resource lifecycles with finalizers.\n * Finalizers run in LIFO (Last In, First Out) order when the scope closes.\n *\n * @example\n * ```ts\n * const DatabaseLive = Layer.scoped(Database)(\n * Fx.gen(function* () {\n * const scope = yield* Scope\n *\n * const connection = createConnection()\n *\n * // Register cleanup - runs when scope closes\n * yield* scope.addFinalizer(() =>\n * Fx.gen(function* () {\n * connection.close()\n * })\n * )\n *\n * return { query: (sql) => connection.query(sql) }\n * })\n * )\n * ```\n */\nexport type ScopeService = {\n /**\n * Add a finalizer to be run when the scope closes.\n * Finalizers are run in LIFO order.\n *\n * @param finalizer - A function that returns an Fx to run on cleanup\n * @returns An Fx that completes when the finalizer is registered\n */\n addFinalizer(finalizer: () => SyncFx<void> | AsyncFx<void>): SyncFx<void>\n\n /**\n * Close the scope, running all finalizers in LIFO order.\n *\n * @param exit - The exit status of the computation\n * @returns An Fx that completes when all finalizers have run\n */\n close(exit: Result<unknown, unknown>): SyncFx<void> | AsyncFx<void>\n\n /**\n * Fork a child scope.\n * The child scope will be closed when the parent scope closes.\n *\n * @returns A new child scope\n */\n fork(): ScopeService\n}\n\n// Create the Scope service tag\nclass ScopeTag extends Service<ScopeService>()(\"@std/Scope\") {}\nexport { ScopeTag as Scope }\n\n// ============================================================================\n// Scope Implementation\n// ============================================================================\n\n/**\n * Create a new Scope instance.\n * This is the concrete implementation of the ScopeService interface.\n */\nexport function createScope(): ScopeService {\n type Finalizer = () => SyncFx<void> | AsyncFx<void>\n const finalizers: Finalizer[] = []\n let closed = false\n const children: ScopeService[] = []\n\n const scope: ScopeService = {\n addFinalizer(finalizer: Finalizer): SyncFx<void> {\n return {\n _tag: \"SyncFx\",\n [FxTypeId]: {\n _A: () => undefined as void,\n _E: () => undefined as never,\n _R: () => undefined as never,\n },\n // oxlint-disable-next-line require-yield\n *[Symbol.iterator](): Generator<FxYield<never, never>, void, unknown> {\n if (!closed) {\n finalizers.push(finalizer)\n }\n },\n } as SyncFx<void>\n },\n\n close(exit: Result<unknown, unknown>): SyncFx<void> | AsyncFx<void> {\n // Check if any finalizer is async\n const hasAsyncFinalizer = finalizers.some((f) => {\n const fx = f()\n return fx._tag === \"AsyncFx\"\n })\n\n if (hasAsyncFinalizer) {\n return {\n _tag: \"AsyncFx\",\n [FxTypeId]: {\n _A: () => undefined as void,\n _E: () => undefined as never,\n _R: () => undefined as never,\n },\n // oxlint-disable-next-line require-yield\n async *[Symbol.asyncIterator](): AsyncGenerator<FxYield<never, never>, void, unknown> {\n if (closed) return\n closed = true\n\n // Close children first\n for (const child of [...children].toReversed()) {\n const childClose = child.close(exit)\n if (childClose._tag === \"AsyncFx\") {\n // oxlint-disable-next-line no-await-in-loop\n await runAsync(childClose)\n } else {\n runSync(childClose)\n }\n }\n\n // Run finalizers in LIFO order\n const reversed = [...finalizers].toReversed()\n for (const finalizer of reversed) {\n const fx = finalizer()\n if (fx._tag === \"AsyncFx\") {\n // oxlint-disable-next-line no-await-in-loop\n await runAsync(fx)\n } else {\n runSync(fx)\n }\n }\n },\n } as AsyncFx<void>\n }\n\n // Sync version\n return {\n _tag: \"SyncFx\",\n [FxTypeId]: {\n _A: () => undefined as void,\n _E: () => undefined as never,\n _R: () => undefined as never,\n },\n // oxlint-disable-next-line require-yield\n *[Symbol.iterator](): Generator<FxYield<never, never>, void, unknown> {\n if (closed) return\n closed = true\n\n // Close children first\n for (const child of [...children].toReversed()) {\n const childClose = child.close(exit)\n runSync(childClose as SyncFx<void>)\n }\n\n // Run finalizers in LIFO order\n const reversed = [...finalizers].toReversed()\n for (const finalizer of reversed) {\n const fx = finalizer()\n runSync(fx as SyncFx<void>)\n }\n },\n } as SyncFx<void>\n },\n\n fork(): ScopeService {\n const child = createScope()\n children.push(child)\n return child\n },\n }\n\n return scope\n}\n\n// ============================================================================\n// Helper Types\n// ============================================================================\n\n/**\n * Type utility to exclude Scope from requirements.\n * Used by Layer.scoped to auto-provide Scope.\n */\nexport type ExcludeScope<R> = Exclude<R, ScopeService>\n","import { ok } from \"../result/result\"\nimport type { Context } from \"./context\"\nimport { FxTypeId } from \"./fx.types\"\nimport type { RunnableFx, SyncFx, AsyncFx, FxYield } from \"./fx.types\"\nimport type { Layer } from \"./layer.types\"\nimport type { ScopeService } from \"./scope\"\nimport { isServiceClass } from \"./service\"\n\n// ============================================================================\n// MemoMap\n// ============================================================================\n\ntype AnyLayer = Layer<unknown, unknown, unknown>\n\n/**\n * MemoMap caches built layers so each layer is only built once.\n * Multiple dependents share the same service instance.\n *\n * This implements the \"service singleton\" pattern where a service\n * is instantiated once and shared across all consumers.\n *\n * @example\n * ```ts\n * // Database is built once, shared by DocumentService and TeamService\n * const AppLayer = Layer.merge(\n * ConfigLive,\n * LoggerLive,\n * DatabaseLive, // Built once\n * DocumentServiceLive, // Uses shared Database\n * TeamServiceLive, // Uses same Database instance\n * )\n * ```\n */\nexport class MemoMap {\n private cache = new Map<\n AnyLayer,\n {\n promise?: Promise<Context<unknown>>\n context?: Context<unknown>\n building?: boolean\n }\n >()\n\n /**\n * Get a cached context or build the layer if not cached.\n *\n * @param layer - The layer to get or build\n * @param scope - The scope for resource management\n * @param deps - Context containing the layer's dependencies\n * @returns A RunnableFx producing the layer's context\n */\n getOrBuild<ROut, E, RIn>(\n layer: Layer<ROut, E, RIn>,\n scope: ScopeService,\n deps: Context<RIn>,\n ): RunnableFx<Context<ROut>, E> {\n const cached = this.cache.get(layer as AnyLayer)\n\n // Already built - return cached context\n if (cached?.context) {\n return {\n _tag: \"SyncFx\",\n [FxTypeId]: {\n _A: () => cached.context as Context<ROut>,\n _E: () => undefined as unknown as E,\n _R: () => undefined as never,\n },\n run: () => ok(cached.context as Context<ROut>),\n // oxlint-disable-next-line require-yield\n *[Symbol.iterator](): Generator<FxYield<E, never>, Context<ROut>, unknown> {\n return cached.context as Context<ROut>\n },\n } as SyncFx<Context<ROut>, E>\n }\n\n // Building in progress (async) - wait for it\n if (cached?.promise) {\n return {\n _tag: \"AsyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as Context<ROut>,\n _E: () => undefined as unknown as E,\n _R: () => undefined as never,\n },\n run: async () => {\n const ctx = await cached.promise!\n return ok(ctx as Context<ROut>)\n },\n // oxlint-disable-next-line require-yield\n async *[Symbol.asyncIterator](): AsyncGenerator<FxYield<E, never>, Context<ROut>, unknown> {\n const ctx = await cached.promise!\n return ctx as Context<ROut>\n },\n } as AsyncFx<Context<ROut>, E>\n }\n\n // Need to build - mark as building\n this.cache.set(layer as AnyLayer, { building: true })\n\n // Build the layer with provided dependencies\n const buildFx = layer.build(this, scope)\n const cacheRef = this.cache\n\n // Determine if async\n if (buildFx._tag === \"AsyncFx\") {\n // Create a promise for the build\n const buildPromise = (async () => {\n const gen = buildFx[Symbol.asyncIterator]()\n let result = await gen.next()\n\n // Resolve service requests from deps\n while (!result.done) {\n const yielded = result.value\n if (isServiceClass(yielded)) {\n const service = deps._services.get(yielded.key)\n if (service === undefined) {\n throw new Error(`Service \"${yielded.key}\" not found during layer build`)\n }\n // oxlint-disable-next-line no-await-in-loop\n result = await gen.next(service)\n } else {\n // It's an error - rethrow\n throw yielded\n }\n }\n\n const ctx = result.value\n cacheRef.set(layer as AnyLayer, { context: ctx })\n return ctx\n })()\n\n this.cache.set(layer as AnyLayer, { promise: buildPromise })\n\n return {\n _tag: \"AsyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as Context<ROut>,\n _E: () => undefined as unknown as E,\n _R: () => undefined as never,\n },\n run: async () => {\n try {\n const ctx = await buildPromise\n return ok(ctx)\n } catch (e) {\n return {\n ok: false,\n error: e as E,\n *[Symbol.iterator]() {\n yield e as E\n throw new Error(\"Unreachable\")\n },\n }\n }\n },\n async *[Symbol.asyncIterator](): AsyncGenerator<FxYield<E, never>, Context<ROut>, unknown> {\n try {\n const ctx = await buildPromise\n return ctx\n } catch (e) {\n yield e as E\n throw new Error(\"Unreachable\", { cause: e })\n }\n },\n } as AsyncFx<Context<ROut>, E>\n }\n\n // Sync build\n return {\n _tag: \"SyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as Context<ROut>,\n _E: () => undefined as unknown as E,\n _R: () => undefined as never,\n },\n run: () => {\n const gen = buildFx[Symbol.iterator]()\n let result = gen.next()\n\n // Resolve service requests from deps\n while (!result.done) {\n const yielded = result.value\n if (isServiceClass(yielded)) {\n const service = deps._services.get(yielded.key)\n if (service === undefined) {\n throw new Error(`Service \"${yielded.key}\" not found during layer build`)\n }\n result = gen.next(service)\n } else {\n // It's an error\n return {\n ok: false,\n error: yielded as E,\n *[Symbol.iterator]() {\n yield yielded as E\n throw new Error(\"Unreachable\")\n },\n }\n }\n }\n\n const ctx = result.value\n cacheRef.set(layer as AnyLayer, { context: ctx })\n return ok(ctx)\n },\n *[Symbol.iterator](): Generator<FxYield<E, never>, Context<ROut>, unknown> {\n const gen = buildFx[Symbol.iterator]()\n let result = gen.next()\n\n // Resolve service requests from deps\n while (!result.done) {\n const yielded = result.value\n if (isServiceClass(yielded)) {\n const service = deps._services.get(yielded.key)\n if (service === undefined) {\n throw new Error(`Service \"${yielded.key}\" not found during layer build`)\n }\n result = gen.next(service)\n } else {\n // It's an error - yield it\n yield yielded as E\n throw new Error(\"Unreachable\")\n }\n }\n\n cacheRef.set(layer as AnyLayer, { context: result.value })\n return result.value\n },\n } as SyncFx<Context<ROut>, E>\n }\n\n /**\n * Clear the cache.\n * Useful for testing.\n */\n clear(): void {\n this.cache.clear()\n }\n\n /**\n * Get the number of cached layers.\n */\n get size(): number {\n return this.cache.size\n }\n}\n\n/**\n * Create a new MemoMap instance.\n */\nexport const createMemoMap = (): MemoMap => new MemoMap()\n","import { ok } from \"../result/result\"\nimport type { Context } from \"./context\"\nimport { runSync, runAsync } from \"./fx\"\nimport { FxTypeId } from \"./fx.types\"\nimport type { RunnableFx, SyncFx, AsyncFx, FxYield } from \"./fx.types\"\nimport type { Layer } from \"./layer.types\"\nimport { MemoMap } from \"./memo-map\"\nimport { createScope } from \"./scope\"\nimport { isServiceClass } from \"./service\"\nimport type { ServiceClass } from \"./service\"\n\n// ============================================================================\n// Provide Layer\n// ============================================================================\n\n/**\n * Extract the value type from an Fx.\n */\ntype FxValueType<F> = F extends RunnableFx<infer A, unknown, unknown> ? A : never\n\n/**\n * Extract the error type from an Fx.\n */\ntype FxErrorType<F> = F extends RunnableFx<unknown, infer E, unknown> ? E : never\n\n/**\n * Type for the result of provide based on layer sync and fx type.\n * Uses infer to extract A and E from the actual Fx type.\n * - Sync layer + SyncFx → SyncFx\n * - Sync layer + AsyncFx → AsyncFx\n * - Async layer + any fx → AsyncFx\n * - Unknown sync layer + any fx → RunnableFx (fallback)\n */\ntype ProvideResult<\n E2,\n LayerSync extends boolean,\n Fx extends RunnableFx<unknown, unknown, unknown>,\n> = LayerSync extends true\n ? Fx[\"_tag\"] extends \"SyncFx\"\n ? SyncFx<FxValueType<Fx>, FxErrorType<Fx> | E2>\n : AsyncFx<FxValueType<Fx>, FxErrorType<Fx> | E2>\n : LayerSync extends false\n ? AsyncFx<FxValueType<Fx>, FxErrorType<Fx> | E2>\n : RunnableFx<FxValueType<Fx>, FxErrorType<Fx> | E2>\n\n/**\n * Provide a layer to an Fx computation, resolving all service requirements.\n * Creates a new scope for resource management.\n *\n * Type preservation:\n * - Sync layer + SyncFx → SyncFx\n * - Sync layer + AsyncFx → AsyncFx\n * - Async layer + any fx → AsyncFx\n * - Unknown sync layer + any fx → RunnableFx (fallback)\n *\n * @param layer - The layer providing services (must have no external requirements)\n * @returns A function that takes an Fx and returns an Fx with dependencies resolved\n *\n * @example\n * ```ts\n * const result = Fx.run(pipe(\n * updateDocumentWorkflow(userId, docId, data),\n * provide(AppLayer)\n * ))\n * ```\n */\nexport function provide<ROut, E2, LayerSync extends boolean>(\n layer: Layer<ROut, E2, never, LayerSync>,\n): <Fx extends RunnableFx<unknown, unknown, ROut>>(fx: Fx) => ProvideResult<E2, LayerSync, Fx>\nexport function provide<ROut, E2>(layer: Layer<ROut, E2>) {\n return <A, E, R extends ROut>(fx: RunnableFx<A, E, R>): RunnableFx<A, E | E2> => {\n // Determine if the layer or fx is async\n const memoMap = new MemoMap()\n const scope = createScope()\n const layerBuildFx = layer.build(memoMap, scope)\n\n if (layerBuildFx._tag === \"AsyncFx\" || fx._tag === \"AsyncFx\") {\n return {\n _tag: \"AsyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as A,\n _E: () => undefined as unknown as E | E2,\n _R: () => undefined as never,\n },\n async *[Symbol.asyncIterator](): AsyncGenerator<FxYield<E | E2, Exclude<R, ROut>>, A, unknown> {\n try {\n // Build the layer\n let ctx: Context<ROut>\n\n if (layerBuildFx._tag === \"AsyncFx\") {\n const gen = layerBuildFx[Symbol.asyncIterator]()\n let result = await gen.next()\n\n while (!result.done) {\n yield result.value as E2\n // oxlint-disable-next-line no-await-in-loop\n result = await gen.next(undefined)\n }\n ctx = result.value\n } else {\n const gen = layerBuildFx[Symbol.iterator]()\n let result = gen.next()\n\n while (!result.done) {\n yield result.value as E2\n result = gen.next(undefined)\n }\n ctx = result.value\n }\n\n // Run the fx with the context\n if (fx._tag === \"AsyncFx\") {\n const fxGen = fx[Symbol.asyncIterator]()\n let fxResult = await fxGen.next()\n\n while (!fxResult.done) {\n const yielded = fxResult.value\n\n if (isServiceClass(yielded)) {\n const service = ctx._services.get(yielded.key)\n if (service !== undefined) {\n // oxlint-disable-next-line no-await-in-loop\n fxResult = await fxGen.next(service)\n continue\n }\n }\n\n // Pass through (error or unsatisfied service)\n const value = yield yielded as FxYield<E, Exclude<R, ROut>>\n // oxlint-disable-next-line no-await-in-loop\n fxResult = await fxGen.next(value)\n }\n\n return fxResult.value\n }\n\n // Sync fx\n const fxGen = fx[Symbol.iterator]()\n let fxResult = fxGen.next()\n\n while (!fxResult.done) {\n const yielded = fxResult.value\n if (isServiceClass(yielded)) {\n const service = ctx._services.get(yielded.key)\n if (service !== undefined) {\n fxResult = fxGen.next(service)\n continue\n }\n }\n\n const value = yield yielded as FxYield<E, Exclude<R, ROut>>\n fxResult = fxGen.next(value)\n }\n\n return fxResult.value\n } finally {\n const closeResult = scope.close(ok(undefined))\n if (closeResult._tag === \"AsyncFx\") {\n await runAsync(closeResult)\n } else {\n runSync(closeResult)\n }\n }\n },\n } as AsyncFx<A, E | E2>\n }\n\n // Both sync\n return {\n _tag: \"SyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as A,\n _E: () => undefined as unknown as E | E2,\n _R: () => undefined as never,\n },\n *[Symbol.iterator](): Generator<FxYield<E | E2, Exclude<R, ROut>>, A, unknown> {\n try {\n // Build the layer\n const layerGen = layerBuildFx[Symbol.iterator]()\n let layerResult = layerGen.next()\n\n while (!layerResult.done) {\n yield layerResult.value as E2\n layerResult = layerGen.next(undefined)\n }\n\n const ctx = layerResult.value\n\n // Run the fx with the context\n const fxGen = fx[Symbol.iterator]()\n let fxResult = fxGen.next()\n\n while (!fxResult.done) {\n const yielded = fxResult.value\n if (isServiceClass(yielded)) {\n const service = ctx._services.get(yielded.key)\n if (service !== undefined) {\n fxResult = fxGen.next(service)\n continue\n }\n }\n const value = yield yielded as FxYield<E, Exclude<R, ROut>>\n fxResult = fxGen.next(value)\n }\n\n return fxResult.value\n } finally {\n const closeResult = scope.close(ok(undefined))\n // In sync-only branch, closeResult is always SyncFx\n runSync(closeResult as SyncFx<void, never>)\n }\n },\n } as SyncFx<A, E | E2>\n }\n}\n\n// ============================================================================\n// Provide Context\n// ============================================================================\n\n/**\n * Provide a context directly to an Fx computation.\n *\n * @param ctx - The context containing services\n * @returns A function that takes an Fx and returns an Fx with dependencies resolved\n *\n * @example\n * ```ts\n * const ctx = Context.make(Config, configImpl)\n * const result = Fx.run(pipe(\n * myWorkflow,\n * provideContext(ctx)\n * ))\n * ```\n */\nexport const provideContext =\n <R>(ctx: Context<R>) =>\n <A, E>(fx: RunnableFx<A, E, R>): RunnableFx<A, E> => {\n if (fx._tag === \"AsyncFx\") {\n return {\n _tag: \"AsyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as A,\n _E: () => undefined as unknown as E,\n _R: () => undefined as never,\n },\n async *[Symbol.asyncIterator](): AsyncGenerator<FxYield<E, never>, A, unknown> {\n const gen = fx[Symbol.asyncIterator]()\n let result = await gen.next()\n\n while (!result.done) {\n const yielded = result.value\n if (isServiceClass(yielded)) {\n const service = ctx._services.get(yielded.key)\n if (service === undefined) {\n throw new Error(`Service \"${yielded.key}\" not found`)\n }\n // oxlint-disable-next-line no-await-in-loop\n result = await gen.next(service)\n } else {\n yield yielded as E\n // oxlint-disable-next-line no-await-in-loop\n result = await gen.next(undefined)\n }\n }\n\n return result.value\n },\n } as AsyncFx<A, E>\n }\n\n return {\n _tag: \"SyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as A,\n _E: () => undefined as unknown as E,\n _R: () => undefined as never,\n },\n *[Symbol.iterator](): Generator<FxYield<E, never>, A, unknown> {\n const gen = fx[Symbol.iterator]()\n let result = gen.next()\n\n while (!result.done) {\n const yielded = result.value\n if (isServiceClass(yielded)) {\n const service = ctx._services.get(yielded.key)\n if (service === undefined) {\n throw new Error(`Service \"${yielded.key}\" not found`)\n }\n result = gen.next(service)\n } else {\n yield yielded as E\n result = gen.next(undefined)\n }\n }\n\n return result.value\n },\n } as SyncFx<A, E>\n }\n\n// ============================================================================\n// Provide Service\n// ============================================================================\n\n/**\n * Provide a single service to an Fx computation.\n *\n * @param service - The service class (tag)\n * @param impl - The service implementation\n * @returns A function that takes an Fx and returns an Fx with the service provided\n *\n * @example\n * ```ts\n * const result = Fx.run(pipe(\n * myWorkflow,\n * provideService(Config, configImpl),\n * provideService(Logger, loggerImpl),\n * ))\n * ```\n */\nexport const provideService =\n <S>(service: ServiceClass<S>, impl: S) =>\n <A, E, R>(fx: RunnableFx<A, E, R | S>): RunnableFx<A, E, Exclude<R, S>> => {\n if (fx._tag === \"AsyncFx\") {\n return {\n _tag: \"AsyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as A,\n _E: () => undefined as unknown as E,\n _R: () => undefined as unknown as Exclude<R, S>,\n },\n async *[Symbol.asyncIterator](): AsyncGenerator<FxYield<E, Exclude<R, S>>, A, unknown> {\n const gen = fx[Symbol.asyncIterator]()\n let result = await gen.next()\n\n while (!result.done) {\n const yielded = result.value\n if (isServiceClass(yielded) && yielded.key === service.key) {\n // oxlint-disable-next-line no-await-in-loop\n result = await gen.next(impl)\n } else {\n const value = yield yielded as FxYield<E, Exclude<R, S>>\n // oxlint-disable-next-line no-await-in-loop\n result = await gen.next(value)\n }\n }\n\n return result.value\n },\n } as AsyncFx<A, E, Exclude<R, S>>\n }\n\n return {\n _tag: \"SyncFx\",\n [FxTypeId]: {\n _A: () => undefined as unknown as A,\n _E: () => undefined as unknown as E,\n _R: () => undefined as unknown as Exclude<R, S>,\n },\n *[Symbol.iterator](): Generator<FxYield<E, Exclude<R, S>>, A, unknown> {\n const gen = fx[Symbol.iterator]()\n let result = gen.next()\n\n while (!result.done) {\n const yielded = result.value\n if (isServiceClass(yielded) && yielded.key === service.key) {\n result = gen.next(impl)\n } else {\n const value = yield yielded as FxYield<E, Exclude<R, S>>\n result = gen.next(value)\n }\n }\n\n return result.value\n },\n } as SyncFx<A, E, Exclude<R, S>>\n }\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index-BQ5wVDSP.d.mts","names":[],"sources":["../src/option/option.ts"],"sourcesContent":[],"mappings":";;;;;;AAkCA;;;;;AAyBA;AAgCA;;;AAA+E,cAzDlE,IAyDkE,EAAA,CAAA,CAAA,CAAA,CAAA,KAAA,EAzDhD,CAyDgD,EAAA,GAzD5C,QAyD4C,CAzDjC,CAyDiC,CAAA;;;;AAG/E;;;;;;;AAyCa,cA5EA,IA4EK,EAAA,CAAA,IAAA,KAOhB,CAAA,GAAA,GAnFiC,QAmFjC,CAnF4C,CAmF5C,CAAA;AAyCF;AAyCA;AAqDA;AAuCA;AAmCA;AA+CA;AA2BA;AAiCA;AAwBA;;;;;AA2CA;AAAqC,cAlbxB,MAkbwB,EAAA,CAAA,CAAA,CAAA,CAAA,MAAA,EAlbH,QAkbG,CAlbQ,CAkbR,CAAA,EAAA,GAAA,MAAA,IAlbuB,OAkbvB,CAlb+B,QAkb/B,CAlb0C,CAkb1C,CAAA,EAAA;EAAkB,IAAA,EAAA,MAAA;CAAd,CAAA;AAAa,cA/azC,MA+ayC,EAAA,CAAA,CAAA,CAAA,CAAA,MAAA,EA/apB,QA+aoB,CA/aT,CA+aS,CAAA,EAAA,GAAA,MAAA,IA/aM,OA+aN,CA/ac,QA+ad,CA/ayB,CA+azB,CAAA,EAAA;EAyCzC,IAAA,EAAA,MAgBH;CApiBqB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAqGlB,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAgDL,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAyCT,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAqDL,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAuCR,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;cAmCR,KAAK;;;;;;;;;;;;;;;;;;;;;;;;cA+CL,UAAU;;;;;;;;;;;;;;;;;;;;;;;cA2BV,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAiCd,OAAO;;;;;;;;;;;;;;;cAwBP,yBAA0B,yBAAuB,SAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA2C5D,uBAAwB,MAAI,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;cAyC1C;4BAphBkB,MAAI,SAAW;kCAyBX,SAAW;+BAgCZ,SAAW,iBAAe,QAAQ,SAAW;;;+BAG7C,SAAW,iBAAe,QAAQ,SAAW;;;;;;;;;;;;oCAoYxC,yBAAuB,SAAW;kCA2CpC,MAAI,cAAc"}
1
+ {"version":3,"file":"index-BQ5wVDSP.d.mts","names":[],"sources":["../src/option/option.ts"],"sourcesContent":[],"mappings":";;;;;;AAkCA;;;;;AAyBA;AAgCA;;;AAA+E,cAzDlE,IAyDkE,EAAA,CAAA,CAAA,CAAA,CAAA,KAAA,EAzDhD,CAyDgD,EAAA,GAzD5C,QAyD4C,CAzDjC,CAyDiC,CAAA;;;;AAG/E;;;;;;;AAyCa,cA5EA,IA4EK,EAAA,CAAA,IAOhB,KAAA,CAAA,GAAA,GAnFiC,QAmFjC,CAnF4C,CAmF5C,CAAA;AAyCF;AAyCA;AAqDA;AAuCA;AAmCA;AA+CA;AA2BA;AAiCA;AAwBA;;;;;AA2CA;AAAqC,cAlbxB,MAkbwB,EAAA,CAAA,CAAA,CAAA,CAAA,MAAA,EAlbH,QAkbG,CAlbQ,CAkbR,CAAA,EAAA,GAAA,MAAA,IAlbuB,OAkbvB,CAlb+B,QAkb/B,CAlb0C,CAkb1C,CAAA,EAAA;EAAkB,IAAA,EAAA,MAAA;CAAd,CAAA;AAAa,cA/azC,MA+ayC,EAAA,CAAA,CAAA,CAAA,CAAA,MAAA,EA/apB,QA+aoB,CA/aT,CA+aS,CAAA,EAAA,GAAA,MAAA,IA/aM,OA+aN,CA/ac,QA+ad,CA/ayB,CA+azB,CAAA,EAAA;EAyCzC,IAAA,EAAA,MAgBH;CApiBqB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAqGlB,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAgDL,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAyCT,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAqDL,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAuCR,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;cAmCR,KAAK;;;;;;;;;;;;;;;;;;;;;;;;cA+CL,UAAU;;;;;;;;;;;;;;;;;;;;;;;cA2BV,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAiCd,OAAO;;;;;;;;;;;;;;;cAwBP,yBAA0B,yBAAuB,SAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA2C5D,uBAAwB,MAAI,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;cAyC1C;4BAphBkB,MAAI,SAAW;kCAyBX,SAAW;+BAgCZ,SAAW,iBAAe,QAAQ,SAAW;;;+BAG7C,SAAW,iBAAe,QAAQ,SAAW;;;;;;;;;;;;oCAoYxC,yBAAuB,SAAW;kCA2CpC,MAAI,cAAc"}
@@ -1,4 +1,4 @@
1
- import { a as FxError, h as SyncFx, i as Fx$1, n as AsyncFxGenerator, o as FxGenerator, p as RunnableFx, s as FxRequirements, t as AsyncFx } from "./fx.types-DO-8yG4c.mjs";
1
+ import { a as FxError, h as SyncFx, i as Fx$1, p as RunnableFx, s as FxRequirements, t as AsyncFx } from "./fx.types-DO-8yG4c.mjs";
2
2
  import { b as Err, j as Ok, n as Result } from "./result.types-fIbuBwVQ.mjs";
3
3
  import { i as Option } from "./option.types-Cluybn30.mjs";
4
4
  import { O as Either } from "./index-Bs5TTFlK.mjs";
@@ -199,12 +199,12 @@ declare function fxGen<P extends [unknown, ...unknown[]], Yielded extends Fx$1<u
199
199
  /**
200
200
  * Execute a sync computation immediately and return the Exit.
201
201
  * Catches unexpected thrown exceptions and wraps them as Defect.
202
- * For computations without service dependencies.
202
+ * Infers A, E, and R types from yielded Fx values (same as Fx.gen).
203
203
  *
204
+ * @template Yielded - The type of values yielded by the generator (must implement Fx protocol)
204
205
  * @template A - The success value type
205
- * @template E - The error type
206
206
  * @param generatorFn - A function that returns a sync generator
207
- * @returns Exit<A, E>
207
+ * @returns Exit<A, FxError<Yielded>>
208
208
  *
209
209
  * @example
210
210
  * ```ts
@@ -217,16 +217,16 @@ declare function fxGen<P extends [unknown, ...unknown[]], Yielded extends Fx$1<u
217
217
  * // exit = { _tag: "Ok", value: 30 }
218
218
  * ```
219
219
  */
220
- declare function fxFn<A$1, E$1>(generatorFn: () => FxGenerator<A$1, E$1, never>): Exit<A$1, E$1>;
220
+ declare function fxFn<Yielded extends Fx$1<unknown, unknown, unknown>, A$1>(generatorFn: () => Generator<Yielded, A$1, unknown>): Exit<A$1, FxError<Yielded>>;
221
221
  /**
222
222
  * Execute an async computation immediately and return a Promise of the Exit.
223
223
  * Catches unexpected thrown exceptions and wraps them as Defect.
224
- * For computations without service dependencies.
224
+ * Infers A, E, and R types from yielded Fx values (same as Fx.gen).
225
225
  *
226
+ * @template Yielded - The type of values yielded by the generator (must implement Fx protocol)
226
227
  * @template A - The success value type
227
- * @template E - The error type
228
228
  * @param generatorFn - A function that returns an async generator
229
- * @returns Promise<Exit<A, E>>
229
+ * @returns Promise<Exit<A, FxError<Yielded>>>
230
230
  *
231
231
  * @example
232
232
  * ```ts
@@ -238,19 +238,19 @@ declare function fxFn<A$1, E$1>(generatorFn: () => FxGenerator<A$1, E$1, never>)
238
238
  * // Type: Promise<Exit<unknown, Error>>
239
239
  * ```
240
240
  */
241
- declare function fxFn<A$1, E$1>(generatorFn: () => AsyncFxGenerator<A$1, E$1, never>): Promise<Exit<A$1, E$1>>;
241
+ declare function fxFn<Yielded extends Fx$1<unknown, unknown, unknown>, A$1>(generatorFn: () => AsyncGenerator<Yielded, A$1, unknown>): Promise<Exit<A$1, FxError<Yielded>>>;
242
242
  /**
243
243
  * Execute a sync computation with service dependencies immediately.
244
244
  * Catches unexpected thrown exceptions and wraps them as Defect.
245
245
  * The second argument is required when the computation has service requirements (R ≠ never).
246
+ * Infers A, E, and R types from yielded Fx values (same as Fx.gen).
246
247
  *
248
+ * @template Yielded - The type of values yielded by the generator (must implement Fx protocol)
247
249
  * @template A - The success value type
248
- * @template E - The error type from the computation
249
250
  * @template E2 - The error type from the provider (layer)
250
- * @template R - The required services type
251
251
  * @param generatorFn - A function that returns a sync generator with service requirements
252
252
  * @param provider - A function that provides the services (e.g., provide(AppLayer))
253
- * @returns Exit<A, E | E2>
253
+ * @returns Exit<A, FxError<Yielded> | E2>
254
254
  *
255
255
  * @example
256
256
  * ```ts
@@ -263,19 +263,19 @@ declare function fxFn<A$1, E$1>(generatorFn: () => AsyncFxGenerator<A$1, E$1, ne
263
263
  * // Type: Exit<string, never>
264
264
  * ```
265
265
  */
266
- declare function fxFn<A$1, E$1, E2, R$1>(generatorFn: () => FxGenerator<A$1, E$1, R$1>, provider: (fx: RunnableFx<A$1, E$1, R$1>) => RunnableFx<A$1, E$1 | E2>): Exit<A$1, E$1 | E2>;
266
+ declare function fxFn<Yielded extends Fx$1<unknown, unknown, unknown>, A$1, E2>(generatorFn: () => Generator<Yielded, A$1, unknown>, provider: (fx: RunnableFx<A$1, FxError<Yielded>, FxRequirements<Yielded>>) => RunnableFx<A$1, FxError<Yielded> | E2>): Exit<A$1, FxError<Yielded> | E2>;
267
267
  /**
268
268
  * Execute an async computation with service dependencies immediately.
269
269
  * Catches unexpected thrown exceptions and wraps them as Defect.
270
270
  * The second argument is required when the computation has service requirements (R ≠ never).
271
+ * Infers A, E, and R types from yielded Fx values (same as Fx.gen).
271
272
  *
273
+ * @template Yielded - The type of values yielded by the generator (must implement Fx protocol)
272
274
  * @template A - The success value type
273
- * @template E - The error type from the computation
274
275
  * @template E2 - The error type from the provider (layer)
275
- * @template R - The required services type
276
276
  * @param generatorFn - A function that returns an async generator with service requirements
277
277
  * @param provider - A function that provides the services (e.g., provide(AppLayer))
278
- * @returns Promise<Exit<A, E | E2>>
278
+ * @returns Promise<Exit<A, FxError<Yielded> | E2>>
279
279
  *
280
280
  * @example
281
281
  * ```ts
@@ -287,7 +287,7 @@ declare function fxFn<A$1, E$1, E2, R$1>(generatorFn: () => FxGenerator<A$1, E$1
287
287
  * // Type: Promise<Exit<string, never>>
288
288
  * ```
289
289
  */
290
- declare function fxFn<A$1, E$1, E2, R$1>(generatorFn: () => AsyncFxGenerator<A$1, E$1, R$1>, provider: (fx: RunnableFx<A$1, E$1, R$1>) => RunnableFx<A$1, E$1 | E2>): Promise<Exit<A$1, E$1 | E2>>;
290
+ declare function fxFn<Yielded extends Fx$1<unknown, unknown, unknown>, A$1, E2>(generatorFn: () => AsyncGenerator<Yielded, A$1, unknown>, provider: (fx: RunnableFx<A$1, FxError<Yielded>, FxRequirements<Yielded>>) => RunnableFx<A$1, FxError<Yielded> | E2>): Promise<Exit<A$1, FxError<Yielded> | E2>>;
291
291
  /**
292
292
  * Handler functions for matching on a tagged union by `_tag` discriminator.
293
293
  * Each handler receives the narrowed variant corresponding to its tag key.
@@ -843,4 +843,4 @@ declare const provideContext: <R$1>(ctx: Context<R$1>) => <A$1, E$1>(fx: Runnabl
843
843
  declare const provideService: <S>(service: ServiceClass<S>, impl: S) => <A$1, E$1, R$1>(fx: RunnableFx<A$1, E$1, R$1 | S>) => RunnableFx<A$1, E$1, Exclude<R$1, S>>;
844
844
  //#endregion
845
845
  export { gen as A, isServiceClass as C, err as D, TaggedMatch as E, Unify as F, UnifyEither as I, UnifyFx as L, run as M, Defect as N, fn as O, Exit as P, UnifyOption as R, ServiceOf as S, Fx as T, createScope as _, Layer$1 as a, ServiceClass as b, LayerROut as c, UnprovidedDeps as d, MemoMap as f, ScopeTag as g, ScopeService as h, Layer as i, ok as j, fxMatch as k, MergeError as l, ExcludeScope as m, provideContext as n, LayerError as o, createMemoMap as p, provideService as r, LayerRIn as s, provide as t, MergeROut as u, Context as v, serviceTag as w, ServiceKey as x, Service as y, UnifyResult as z };
846
- //# sourceMappingURL=index-DQoTXLSm.d.mts.map
846
+ //# sourceMappingURL=index-UYodvXes.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-UYodvXes.d.mts","names":[],"sources":["../src/shared/unify.types.ts","../src/fx/exit.ts","../src/fx/fx.ts","../src/fx/service.ts","../src/fx/context.ts","../src/fx/scope.ts","../src/fx/memo-map.ts","../src/fx/layer.types.ts","../src/fx/layer.ts","../src/fx/provide.ts"],"sourcesContent":[],"mappings":"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AAJ;;;;;;;ADpBjC;;;;iBEQS,KFRoD,CAAA,GAAA,EAAA,GAAA,CAAA,CAAA,EAAA,EEQpC,MFRoC,CEQ7B,GFR6B,EEQ1B,GFR0B,CAAA,CAAA,EEQrB,IFRqB,CEQhB,GFRgB,EEQb,GFRa,CAAA;;AAK7D;;;;;;;AAKA,iBEQS,KFRc,CAAA,GAAA,EAAA,GAAA,CAAA,CAAA,EAAA,EEQE,OFRF,CEQU,GFRV,EEQa,GFRb,CAAA,CAAA,EEQkB,OFRlB,CEQ0B,IFR1B,CEQ+B,GFR/B,EEQkC,GFRlC,CAAA,CAAA;;;;;;iBEed,KFfmE,CAAA,GAAA,EAAA,GAAA,CAAA,CAAA,EAAA,EEenD,UFfmD,CEexC,GFfwC,EEerC,GFfqC,CAAA,CAAA,EEehC,IFfgC,CEe3B,GFf2B,EEexB,GFfwB,CAAA,GEenB,OFfmB,CEeX,IFfW,CEeN,GFfM,EEeH,GFfG,CAAA,CAAA;AAK5E;;;;;;;;;;;;;;;;;;;;;;;;;ACjBA;AAsBA;;;iBC2HS,KD3H4B,CAAA,gBC2HN,ID3HM,CAAA,OAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,GAAA,CAAA,CAAA,WAAA,EAAA,GAAA,GC4HhB,SD5HgB,CC4HN,OD5HM,EC4HG,GD5HH,EAAA,OAAA,CAAA,CAAA,EC6HlC,MD7HkC,CC6H3B,GD7H2B,EC6HxB,OD7HwB,CC6HhB,OD7HgB,CAAA,EC6HN,cD7HM,CC6HS,OD7HT,CAAA,CAAA;;;;AAmBkD;;;;;;;AAgGvF;;;;;;;;;;;iBCiCS,KDxHyC,CAAA,gBCwHnB,IDxHmB,CAAA,OAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,GAAA,CAAA,CAAA,WAAA,EAAA,GAAA,GCyH7B,cDzH6B,CCyHd,ODzHc,ECyHL,GDzHK,EAAA,OAAA,CAAA,CAAA,EC0H/C,OD1H+C,CC0HvC,GD1HuC,EC0HpC,OD1HoC,CC0H5B,OD1H4B,CAAA,EC0HlB,cD1HkB,CC0HH,OD1HG,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;iBCiJzC,KDlGa,CAAA,UAAA,CAAA,OAAA,EAAA,GAAA,OAAA,EAAA,CAAA,EAAA,gBCkG4C,IDlG5C,CAAA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6CS,OR7CT,CQ6CmB,CR7CnB,EQ6CsB,GR7CtB,EQ6CyB,GR7CzB,EAAA,KAAA,CAAA;EAAO,CAAA,GAAA,EAAA,GAAA,CAAA,CAAA,EAAA,EQ8CjB,UR9CiB,CQ8CN,CR9CM,EQ8CH,GR9CG,EQ8CA,GR9CA,CAAA,CAAA,EQ8CK,OR9CL,CQ8Ce,CR9Cf,EQ8CkB,GR9ClB,EQ8CqB,GR9CrB,EAAA,OAAA,CAAA;CAAY;;;;;AAK1C,iBQiGS,WRjGc,CAAA,CAAA,CAAA,CAAA,OAAA,EQiGU,YRjGV,CQiGuB,CRjGvB,CAAA,CAAA,EAAA;EAAO,CAAA,GAAA,EAAA,GAAA,CAAA,CAAA,EAAA,EQkGjB,MRlGiB,CQkGV,CRlGU,EQkGP,GRlGO,EQkGJ,GRlGI,GQkGA,YRlGA,CAAA,CAAA,EQkGgB,ORlGhB,CQkG0B,CRlG1B,EQkG6B,GRlG7B,EQkGgC,YRlGhC,CQkG6C,GRlG7C,CAAA,EAAA,IAAA,CAAA;EAAY,CAAA,GAAA,EAAA,GAAA,CAAA,CAAA,EAAA,EQmG7B,ORnG6B,CQmGrB,CRnGqB,EQmGlB,GRnGkB,EQmGf,GRnGe,GQmGX,YRnGW,CAAA,CAAA,EQmGK,ORnGL,CQmGe,CRnGf,EQmGkB,GRnGlB,EQmGqB,YRnGrB,CQmGkC,GRnGlC,CAAA,EAAA,KAAA,CAAA;EAAmC,CAAA,GAAA,EAAA,GAAA,CAAA,CAAA,EAAA,EQoGhE,URpGgE,CQoGrD,CRpGqD,EQoGlD,GRpGkD,EQoG/C,GRpG+C,GQoG3C,YRpG2C,CAAA,CAAA,EQoG3B,ORpG2B,CQoGjB,CRpGiB,EQoGd,GRpGc,EQoGX,YRpGW,CQoGE,GRpGF,CAAA,EAAA,OAAA,CAAA;CAAG;;;AAKhF;;iBQsKS,YRtK6B,CAAA,QAAA,EAAA,KAAA,EAAA,OAAA,EAAA,iBAAA,OAAA,CAAA,CAAA,IAAA,EQuK9B,ORvK8B,CQuKpB,QRvKoB,EQuKV,KRvKU,EQuKH,ORvKG,EQuKM,QRvKN,CAAA,CAAA,EAAA;EAAoC,CAAA,IAAA,EAAA,GAAA,EAAA,YQyKlD,QRzKkD,EAAA,kBAAA,OAAA,CAAA,CAAA,KAAA,EQ0K/D,OR1K+D,CQ0KrD,IR1KqD,EQ0K/C,GR1K+C,EQ0K5C,GR1K4C,EQ0KvC,SR1KuC,CAAA,CAAA,EQ2KrE,OR3KqE,CQ2K3D,IR3K2D,GQ2KpD,QR3KoD,EQ2K1C,GR3K0C,GQ2KtC,KR3KsC,EQ2K/B,OR3K+B,EQ2KtB,SR3KsB,SAAA,IAAA,GQ2KG,QR3KH,GAAA,KAAA,CAAA;CAAG;;;;AAK7E;iBQ+RS,UR/Re,CAAA,YQ+RM,OR/RN,CAAA,OAAA,EAAA,OAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,CAAA,CAAA,GAAA,MAAA,EQgSX,GRhSW,CAAA,EQiSrB,ORjSqB,CQiSX,SRjSW,CQiSD,GRjSC,CAAA,EQiSG,URjSH,CQiSc,GRjSd,CAAA,EQiSkB,cRjSlB,CQiSiC,GRjSjC,CAAA,EQiSqC,ORjSrC,CQiS6C,GRjS7C,CAAA,CAAA;AAAY,cQiZvB,KRjZuB,EAAA;EACpB,SAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,OAAA,EQtBa,YRsBb,CQtB0B,CRsB1B,CAAA,EAAA,IAAA,EQtBoC,CRsBpC,EAAA,GQtBwC,ORsBxC,CQtBkD,CRsBlD,EAAA,KAAA,EAAA,KAAA,EAAA,IAAA,CAAA;EAAZ,SAAA,GAAA,EAAA,CAAA,GAAA,CAAA,CAAA,KAAA,EQCwB,GRDxB,EAAA,GQC4B,ORD5B,CAAA,KAAA,EQC6C,GRD7C,EAAA,KAAA,EAAA,IAAA,CAAA;EACC,SAAA,EAAA,EAAA,cAAA;EAAY,SAAA,MAAA,EAAA,kBAAA;EACC,SAAA,OAAA,EAAA,mBAAA;EAAZ,SAAA,KAAA,EAAA,iBAAA;CACC;;;;;AAxBP;KSMK,WTNyB,CAAA,CAAA,CAAA,GSMR,CTNQ,SSME,UTNF,CAAA,KAAA,EAAA,EAAA,OAAA,EAAA,OAAA,CAAA,GAAA,CAAA,GAAA,KAAA;;;;KSWzB,WTX8D,CAAA,CAAA,CAAA,GSW7C,CTX6C,SSWnC,UTXmC,CAAA,OAAA,EAAA,KAAA,EAAA,EAAA,OAAA,CAAA,GAAA,CAAA,GAAA,KAAA;AAKnE;;;;;;;AAKA;KSWK,aTXyB,CAAA,EAAA,EAAA,kBAAA,OAAA,EAAA,aScjB,UTdiB,CAAA,OAAA,EAAA,OAAA,EAAA,OAAA,CAAA,CAAA,GSe1B,STf0B,SAAA,IAAA,GSgB1B,IThB0B,CAAA,MAAA,CAAA,SAAA,QAAA,GSiBxB,MTjBwB,CSiBjB,WTjBiB,CSiBL,ITjBK,CAAA,ESiBA,WTjBA,CSiBY,ITjBZ,CAAA,GSiBkB,ETjBlB,CAAA,GSkBxB,OTlBwB,CSkBhB,WTlBgB,CSkBJ,ITlBI,CAAA,ESkBC,WTlBD,CSkBa,ITlBb,CAAA,GSkBmB,ETlBnB,CAAA,GSmB1B,STnB0B,SAAA,KAAA,GSoBxB,OTpBwB,CSoBhB,WTpBgB,CSoBJ,ITpBI,CAAA,ESoBC,WTpBD,CSoBa,ITpBb,CAAA,GSoBmB,ETpBnB,CAAA,GSqBxB,UTrBwB,CSqBb,WTrBa,CSqBD,ITrBC,CAAA,ESqBI,WTrBJ,CSqBgB,ITrBhB,CAAA,GSqBsB,ETrBtB,CAAA;;;;;;AAK9B;;;;;;;;AAKA;;;;;;;;AAGM,iBS+BU,OT/BV,CAAA,IAAA,EAAA,EAAA,EAAA,kBAAA,OAAA,CAAA,CAAA,KAAA,ESgCG,OThCH,CSgCS,IThCT,ESgCe,EThCf,EAAA,KAAA,ESgC0B,SThC1B,CAAA,CAAA,EAAA,CAAA,aSiCS,UTjCT,CAAA,OAAA,EAAA,OAAA,ESiCsC,ITjCtC,CAAA,CAAA,CAAA,EAAA,ESiCiD,ITjCjD,EAAA,GSiCwD,aTjCxD,CSiCsE,ETjCtE,ESiC0E,STjC1E,ESiCqF,ITjCrF,CAAA;;;;;;;;;;;;;;ACzBN;AAsBA;AAA4B,cQ2Mf,cR3Me,EAAA,CAAA,GAAA,CAAA,CAAA,GAAA,EQ4MjB,OR5MiB,CQ4MT,GR5MS,CAAA,EAAA,GAAA,CAAA,GAAA,EAAA,GAAA,CAAA,CAAA,EAAA,EQ6Mf,UR7Me,CQ6MJ,GR7MI,EQ6MD,GR7MC,EQ6ME,GR7MF,CAAA,EAAA,GQ6MO,UR7MP,CQ6MkB,GR7MlB,EQ6MqB,GR7MrB,CAAA;;;;;;AAmB2D;;;;;;;AAgGvF;;;;AArG8B,cQmRjB,cRnRiB,EAAA,CAAA,CAAA,CAAA,CAAA,OAAA,EQoRf,YRpRe,CQoRF,CRpRE,CAAA,EAAA,IAAA,EQoRQ,CRpRR,EAAA,GAAA,CAAA,GAAA,EAAA,GAAA,EAAA,GAAA,CAAA,CAAA,EAAA,EQqRd,URrRc,CQqRH,GRrRG,EQqRA,GRrRA,EQqRG,GRrRH,GQqRO,CRrRP,CAAA,EAAA,GQqRY,URrRZ,CQqRuB,GRrRvB,EQqR0B,GRrR1B,EQqR6B,ORrR7B,CQqRqC,GRrRrC,EQqRwC,CRrRxC,CAAA,CAAA"}
package/dist/index.d.mts CHANGED
@@ -10,7 +10,7 @@ import { a as ErrorData, c as TaggedErrorFactory, l as TaggedErrorInstance, n as
10
10
  import { t as flow } from "./index-BahMvQpA.mjs";
11
11
  import { t as Option } from "./index-BQ5wVDSP.mjs";
12
12
  import { t as pipe } from "./index-IdejL485.mjs";
13
- import { E as TaggedMatch, F as Unify, I as UnifyEither, L as UnifyFx, N as Defect, P as Exit, R as UnifyOption, S as ServiceOf, T as Fx, a as Layer$1, b as ServiceClass, c as LayerROut, g as ScopeTag, h as ScopeService, i as Layer, n as provideContext, o as LayerError, r as provideService, s as LayerRIn, t as provide, v as Context, w as serviceTag, y as Service, z as UnifyResult } from "./index-DQoTXLSm.mjs";
13
+ import { E as TaggedMatch, F as Unify, I as UnifyEither, L as UnifyFx, N as Defect, P as Exit, R as UnifyOption, S as ServiceOf, T as Fx, a as Layer$1, b as ServiceClass, c as LayerROut, g as ScopeTag, h as ScopeService, i as Layer, n as provideContext, o as LayerError, r as provideService, s as LayerRIn, t as provide, v as Context, w as serviceTag, y as Service, z as UnifyResult } from "./index-UYodvXes.mjs";
14
14
  import { f as Predicate$1, p as Refinement, t as Predicate } from "./index-78LWwTds.mjs";
15
15
  import { t as Result } from "./index-BuLJRX1e.mjs";
16
16
  export { ADT, ArrayValue, AsyncFx, AsyncReturnType, Brand, BrandError, BrandKey, Brand$1 as BrandType, Branded, Context, Context as ContextType, DeepMutable, DeepPartial, DeepPrettify, DeepReadonly, DeepRequired, Either, Either$1 as EitherType, Equals, Err, ErrorData, ErrorTag, Exit, Exit as ExitType, Defect as ExitDefect, Fx, FxError, FxRequirements, FxSuccess, Fx$1 as FxType, Head, Infer, InferInput, InferOutput, Init, IsAny, IsNever, IsUnknown, KeysOfType, Last, Layer, LayerError, LayerRIn, LayerROut, Layer$1 as LayerType, Length, Merge, NoUnion, None, OmitByType, Option, Option$1 as OptionType, PartialKeys, PickByType, Pipeable, Predicate, Predicate$1 as PredicateType, Prettify, RecordDef, RecordObject, Refinement, RequiredKeys, Result, Result$1 as ResultType, ScopeTag as Scope, ScopeService, Service, ServiceClass, ServiceOf, ServiceRequest, StructValue, SyncFx, TaggedConstructor, TaggedError, TaggedErrorFactory, TaggedErrorInstance, TaggedError$1 as TaggedErrorType, TaggedMatch, TaggedValue, Tail, TupleValue, Unbrand, Unify, UnifyEither, UnifyFx, UnifyOption, UnifyResult, UnionToIntersection, ValidationError, array, data, flow, pipe, pipeMethod, provide, provideContext, provideService, record, serviceTag, struct, tagged, tuple };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nicolastoulemont/std",
3
- "version": "0.5.0",
3
+ "version": "0.5.1",
4
4
  "description": "Collection of utilty function for this monorepo",
5
5
  "license": "ISC",
6
6
  "files": [
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-DQoTXLSm.d.mts","names":[],"sources":["../src/shared/unify.types.ts","../src/fx/exit.ts","../src/fx/fx.ts","../src/fx/service.ts","../src/fx/context.ts","../src/fx/scope.ts","../src/fx/memo-map.ts","../src/fx/layer.types.ts","../src/fx/layer.ts","../src/fx/provide.ts"],"sourcesContent":[],"mappings":"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AAJ;;;;;;;ADpBjC;;;;iBEiBS,KFjBoD,CAAA,GAAA,EAAA,GAAA,CAAA,CAAA,EAAA,EEiBpC,MFjBoC,CEiB7B,GFjB6B,EEiB1B,GFjB0B,CAAA,CAAA,EEiBrB,IFjBqB,CEiBhB,GFjBgB,EEiBb,GFjBa,CAAA;;AAK7D;;;;;;;AAKA,iBEiBS,KFjBc,CAAA,GAAA,EAAA,GAAA,CAAA,CAAA,EAAA,EEiBE,OFjBF,CEiBU,GFjBV,EEiBa,GFjBb,CAAA,CAAA,EEiBkB,OFjBlB,CEiB0B,IFjB1B,CEiB+B,GFjB/B,EEiBkC,GFjBlC,CAAA,CAAA;;;;;;iBEwBd,KFxBmE,CAAA,GAAA,EAAA,GAAA,CAAA,CAAA,EAAA,EEwBnD,UFxBmD,CEwBxC,GFxBwC,EEwBrC,GFxBqC,CAAA,CAAA,EEwBhC,IFxBgC,CEwB3B,GFxB2B,EEwBxB,GFxBwB,CAAA,GEwBnB,OFxBmB,CEwBX,IFxBW,CEwBN,GFxBM,EEwBH,GFxBG,CAAA,CAAA;AAK5E;;;;;;;;;;;;;;;;;;;;;;;;;ACjBA;AAsBA;;;iBCoIS,KDpI4B,CAAA,gBCoIN,IDpIM,CAAA,OAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,GAAA,CAAA,CAAA,WAAA,EAAA,GAAA,GCqIhB,SDrIgB,CCqIN,ODrIM,ECqIG,GDrIH,EAAA,OAAA,CAAA,CAAA,ECsIlC,MDtIkC,CCsI3B,GDtI2B,ECsIxB,ODtIwB,CCsIhB,ODtIgB,CAAA,ECsIN,cDtIM,CCsIS,ODtIT,CAAA,CAAA;;;;AAmBkD;;;;;;;AAgGvF;;;;;;;;;;;iBC0CS,KDjIyC,CAAA,gBCiInB,IDjImB,CAAA,OAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,GAAA,CAAA,CAAA,WAAA,EAAA,GAAA,GCkI7B,cDlI6B,CCkId,ODlIc,ECkIL,GDlIK,EAAA,OAAA,CAAA,CAAA,ECmI/C,ODnI+C,CCmIvC,GDnIuC,ECmIpC,ODnIoC,CCmI5B,ODnI4B,CAAA,ECmIlB,cDnIkB,CCmIH,ODnIG,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;iBC0JzC,KD3Ga,CAAA,UAAA,CAAA,OA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S,WRjGc,CAAA,CAAA,CAAA,CAAA,OAAA,EQiGU,YRjGV,CQiGuB,CRjGvB,CAAA,CAAA,EAAA;EAAO,CAAA,GAAA,EAAA,GAAA,CAAA,CAAA,EAAA,EQkGjB,MRlGiB,CQkGV,CRlGU,EQkGP,GRlGO,EQkGJ,GRlGI,GQkGA,YRlGA,CAAA,CAAA,EQkGgB,ORlGhB,CQkG0B,CRlG1B,EQkG6B,GRlG7B,EQkGgC,YRlGhC,CQkG6C,GRlG7C,CAAA,EAAA,IAAA,CAAA;EAAY,CAAA,GAAA,EAAA,GAAA,CAAA,CAAA,EAAA,EQmG7B,ORnG6B,CQmGrB,CRnGqB,EQmGlB,GRnGkB,EQmGf,GRnGe,GQmGX,YRnGW,CAAA,CAAA,EQmGK,ORnGL,CQmGe,CRnGf,EQmGkB,GRnGlB,EQmGqB,YRnGrB,CQmGkC,GRnGlC,CAAA,EAAA,KAAA,CAAA;EAAmC,CAAA,GAAA,EAAA,GAAA,CAAA,CAAA,EAAA,EQoGhE,URpGgE,CQoGrD,CRpGqD,EQoGlD,GRpGkD,EQoG/C,GRpG+C,GQoG3C,YRpG2C,CAAA,CAAA,EQoG3B,ORpG2B,CQoGjB,CRpGiB,EQoGd,GRpGc,EQoGX,YRpGW,CQoGE,GRpGF,CAAA,EAAA,OAAA,CAAA;CAAG;;;AAKhF;;iBQsKS,YRtK6B,CAAA,QAAA,EAAA,KAAA,EAAA,OAAA,EAAA,iBAAA,OAAA,CAAA,CAAA,IAAA,EQuK9B,ORvK8B,CQuKpB,QRvKoB,EQuKV,KRvKU,EQuKH,ORvKG,EQuKM,QRvKN,CAAA,CAAA,EAAA;EAAoC,CAAA,IAAA,EAAA,GAAA,EAAA,YQyKlD,QRzKkD,EAAA,kBAAA,OAAA,CAAA,CAAA,KAAA,EQ0K/D,OR1K+D,CQ0KrD,IR1KqD,EQ0K/C,GR1K+C,EQ0K5C,GR1K4C,EQ0KvC,SR1KuC,CAAA,CAAA,EQ2KrE,OR3KqE,CQ2K3D,IR3K2D,GQ2KpD,QR3KoD,EQ2K1C,GR3K0C,GQ2KtC,KR3KsC,EQ2K/B,OR3K+B,EQ2KtB,SR3KsB,SAAA,IAAA,GQ2KG,QR3KH,GAAA,KAAA,CAAA;CAAG;;;;AAK7E;iBQ+RS,UR/Re,CAAA,YQ+RM,OR/RN,CAAA,OAAA,EAAA,OAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,CAAA,CAAA,GAAA,MAAA,EQgSX,GRhSW,CAAA,EQiSrB,ORjSqB,CQiSX,SRjSW,CQiSD,GRjSC,CAAA,EQiSG,URjSH,CQiSc,GRjSd,CAAA,EQiSkB,cRjSlB,CQiSiC,GRjSjC,CAAA,EQiSqC,ORjSrC,CQiS6C,GRjS7C,CAAA,CAAA;AAAY,cQiZvB,KRjZuB,EAAA;EACpB,SAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,OAAA,EQtBa,YRsBb,CQtB0B,CRsB1B,CAAA,EAAA,IAAA,EQtBoC,CRsBpC,EAAA,GQtBwC,ORsBxC,CQtBkD,CRsBlD,EAAA,KAAA,EAAA,KAAA,EAAA,IAAA,CAAA;EAAZ,SAAA,GAAA,EAAA,CAAA,GAAA,CAAA,CAAA,KAAA,EQCwB,GRDxB,EAAA,GQC4B,ORD5B,CAAA,KAAA,EQC6C,GRD7C,EAAA,KAAA,EAAA,IAAA,CAAA;EACC,SAAA,EAAA,EAAA,cAAA;EAAY,SAAA,MAAA,EAAA,kBAAA;EACC,SAAA,OAAA,EAAA,mBAAA;EAAZ,SAAA,KAAA,EAAA,iBAAA;CACC;;;;;AAxBP;KSMK,WTNyB,CAAA,CAAA,CAAA,GSMR,CTNQ,SSME,UTNF,CAAA,KAAA,EAAA,EAAA,OAAA,EAAA,OAAA,CAAA,GAAA,CAAA,GAAA,KAAA;;;;KSWzB,WTX8D,CAAA,CAAA,CAAA,GSW7C,CTX6C,SSWnC,UTXmC,CAAA,OAAA,EAAA,KAAA,EAAA,EAAA,OAAA,CAAA,GAAA,CAAA,GAAA,KAAA;AAKnE;;;;;;;AAKA;KSWK,aTXyB,CAAA,EAAA,EAAA,kBAAA,OAAA,EAAA,aScjB,UTdiB,CAAA,OAAA,EAAA,OAAA,EAAA,OAAA,CAAA,CAAA,GSe1B,STf0B,SAAA,IAAA,GSgB1B,IThB0B,CAAA,MAAA,CAAA,SAAA,QAAA,GSiBxB,MTjBwB,CSiBjB,WTjBiB,CSiBL,ITjBK,CAAA,ESiBA,WTjBA,CSiBY,ITjBZ,CAAA,GSiBkB,ETjBlB,CAAA,GSkBxB,OTlBwB,CSkBhB,WTlBgB,CSkBJ,ITlBI,CAAA,ESkBC,WTlBD,CSkBa,ITlBb,CAAA,GSkBmB,ETlBnB,CAAA,GSmB1B,STnB0B,SAAA,KAAA,GSoBxB,OTpBwB,CSoBhB,WTpBgB,CSoBJ,ITpBI,CAAA,ESoBC,WTpBD,CSoBa,ITpBb,CAAA,GSoBmB,ETpBnB,CAAA,GSqBxB,UTrBwB,CSqBb,WTrBa,CSqBD,ITrBC,CAAA,ESqBI,WTrBJ,CSqBgB,ITrBhB,CAAA,GSqBsB,ETrBtB,CAAA;;;;;;AAK9B;;;;;;;;AAKA;;;;;;;;AAGM,iBS+BU,OT/BV,CAAA,IAAA,EAAA,EAAA,EAAA,kBAAA,OAAA,CAAA,CAAA,KAAA,ESgCG,OThCH,CSgCS,IThCT,ESgCe,EThCf,EAAA,KAAA,ESgC0B,SThC1B,CAAA,CAAA,EAAA,CAAA,aSiCS,UTjCT,CAAA,OAAA,EAAA,OAAA,ESiCsC,ITjCtC,CAAA,CAAA,CAAA,EAAA,ESiCiD,ITjCjD,EAAA,GSiCwD,aTjCxD,CSiCsE,ETjCtE,ESiC0E,STjC1E,ESiCqF,ITjCrF,CAAA;;;;;;;;;;;;;;ACzBN;AAsBA;AAA4B,cQ2Mf,cR3Me,EAAA,CAAA,GAAA,CAAA,CAAA,GAAA,EQ4MjB,OR5MiB,CQ4MT,GR5MS,CAAA,EAAA,GAAA,CAAA,GAAA,EAAA,GAAA,CAAA,CAAA,EAAA,EQ6Mf,UR7Me,CQ6MJ,GR7MI,EQ6MD,GR7MC,EQ6ME,GR7MF,CAAA,EAAA,GQ6MO,UR7MP,CQ6MkB,GR7MlB,EQ6MqB,GR7MrB,CAAA;;;;;;AAmB2D;;;;;;;AAgGvF;;;;AArG8B,cQmRjB,cRnRiB,EAAA,CAAA,CAAA,CAAA,CAAA,OAAA,EQoRf,YRpRe,CQoRF,CRpRE,CAAA,EAAA,IAAA,EQoRQ,CRpRR,EAAA,GAAA,CAAA,GAAA,EAAA,GAAA,EAAA,GAAA,CAAA,CAAA,EAAA,EQqRd,URrRc,CQqRH,GRrRG,EQqRA,GRrRA,EQqRG,GRrRH,GQqRO,CRrRP,CAAA,EAAA,GQqRY,URrRZ,CQqRuB,GRrRvB,EQqR0B,GRrR1B,EQqR6B,ORrR7B,CQqRqC,GRrRrC,EQqRwC,CRrRxC,CAAA,CAAA"}