import { A as Async, E as Exit } from './effect-DbEMiMvv.js'; /** * Acquires a resource, uses it, and guarantees release regardless of outcome. * * - `acquire` runs uninterruptibly (once started, it completes) * - `use` runs with the acquired resource * - `release` runs after `use` completes (success, failure, or interruption) * * ```ts * const result = bracket( * openConnection(), // acquire * (conn) => queryDatabase(conn), // use * (conn, exit) => conn.close() // release (always runs) * ); * ``` */ declare function bracket(acquire: Async, use: (resource: A) => Async, release: (resource: A, exit: Exit) => Async): Async; /** * Runs `effect` and then runs `finalizer` regardless of the outcome. * The finalizer receives the exit value for inspection. * * ```ts * const result = ensuring( * doWork(), * (exit) => logCompletion(exit) * ); * ``` */ declare function ensuring(effect: Async, finalizer: (exit: Exit) => Async): Async; declare function resource(acquire: Async, release: (resource: A, exit: Exit) => Async): Resource; declare const makeResource: typeof resource; declare function resourceSucceed(value: A): Resource; declare function resourceFromManaged(m: Managed): Resource; declare function useResource(res: Resource, body: (resource: A) => Async): Async; declare function resourceAll(resources: { [K in keyof Resources]: Resource; }): Resource; /** * A Resource describes a scoped value. It is acquired for each `use`, released * in LIFO order, and can be composed with `map`, `flatMap`, and `zip`. */ type Resource = { readonly _tag: "Resource"; readonly use: (body: (resource: A) => Async) => Async; readonly map: (f: (resource: A) => B) => Resource; readonly flatMap: (f: (resource: A) => Resource) => Resource; readonly zip: (that: Resource) => Resource; }; declare const Resource: Readonly<{ make: typeof resource; succeed: typeof resourceSucceed; fromManaged: typeof resourceFromManaged; all: typeof resourceAll; use: typeof useResource; }>; /** * A Managed resource describes how to acquire and release a resource. * It can be used multiple times — each `use` call acquires a fresh instance. * * ```ts * const dbPool = managed( * createPool({ max: 10 }), * (pool) => pool.close() * ); * * // Use it: * const result = useManaged(dbPool, (pool) => pool.query("SELECT 1")); * ``` */ type Managed = { readonly _tag: "Managed"; readonly acquire: Async; readonly release: (resource: A, exit: Exit) => Async; }; /** * Creates a Managed resource descriptor. */ declare function managed(acquire: Async, release: (resource: A, exit?: Exit) => Async): Managed; /** * Uses a Managed resource: acquires, runs the body, and releases. */ declare function useManaged(m: Managed, body: (resource: A) => Async): Async; /** * Combines multiple Managed resources. All are acquired in order, * and released in reverse order (LIFO). * * ```ts * const resources = managedAll([dbPool, cacheConn, fileHandle]); * const result = useManaged(resources, ([db, cache, file]) => ...); * ``` */ declare function managedAll(manageds: { [K in keyof Resources]: Managed; }): Managed; type SpanContext = { readonly traceId: string; readonly spanId: string; readonly parentSpanId?: string; }; type SpanStatus = "ok" | "error" | "unset"; type Span = { readonly name: string; readonly context: SpanContext; readonly startTime: number; endTime?: number; status: SpanStatus; readonly attributes: Record; readonly events: SpanEvent[]; }; type SpanEvent = { readonly name: string; readonly time: number; readonly attributes?: Record; }; type TracerConfig = { /** Service name for span metadata. */ readonly serviceName: string; /** Called when a span ends (for export). */ readonly onSpanEnd?: (span: Span) => void; /** Sampling rate (0.0 to 1.0). Default: 1.0 (sample everything). */ readonly sampleRate?: number; }; type Tracer = { /** Wrap an effect in a span. */ readonly span: (name: string, effect: Async, attributes?: Record) => Async; /** Get all completed spans (for testing). */ readonly spans: () => readonly Span[]; /** Clear collected spans. */ readonly clear: () => void; }; /** * Creates a tracer that wraps effects in spans. * * ```ts * const tracer = makeTracer({ serviceName: "my-app" }); * * const result = await run( * tracer.span("fetchUser", fetchUser(id), { userId: id }) * ); * * console.log(tracer.spans()); // all completed spans * ``` */ declare function makeTracer(config: TracerConfig): Tracer; export { type Managed as M, Resource as R, type Span as S, type Tracer as T, type SpanContext as a, type SpanEvent as b, type SpanStatus as c, type TracerConfig as d, bracket as e, ensuring as f, makeTracer as g, managed as h, managedAll as i, resourceAll as j, resourceFromManaged as k, resourceSucceed as l, makeResource as m, useResource as n, resource as r, useManaged as u };