import * as Deferred from "./Deferred.ts"; import * as Effect from "./Effect.ts"; import * as Fiber from "./Fiber.ts"; import type * as Inspectable from "./Inspectable.ts"; import * as Option from "./Option.ts"; import type { Pipeable } from "./Pipeable.ts"; import type { Scheduler } from "./Scheduler.ts"; import type * as Scope from "./Scope.ts"; declare const TypeId = "~effect/FiberHandle"; /** * @example * ```ts * import { Effect, Fiber, FiberHandle } from "effect" * * Effect.gen(function*() { * // Create a FiberHandle that can hold fibers producing strings * const handle = yield* FiberHandle.make() * * // The handle can store and manage a single fiber * const fiber = yield* FiberHandle.run(handle, Effect.succeed("hello")) * const result = yield* Fiber.await(fiber) * console.log(result) // "hello" * }) * ``` * * @since 2.0.0 * @category models */ export interface FiberHandle extends Pipeable, Inspectable.Inspectable { readonly [TypeId]: typeof TypeId; readonly deferred: Deferred.Deferred; state: { readonly _tag: "Open"; fiber: Fiber.Fiber | undefined; } | { readonly _tag: "Closed"; }; } /** * @example * ```ts * import { Effect, FiberHandle } from "effect" * * Effect.gen(function*() { * const handle = yield* FiberHandle.make() * * console.log(FiberHandle.isFiberHandle(handle)) // true * console.log(FiberHandle.isFiberHandle("not a handle")) // false * }) * ``` * * @since 2.0.0 * @category refinements */ export declare const isFiberHandle: (u: unknown) => u is FiberHandle; /** * A FiberHandle can be used to store a single fiber. * When the associated Scope is closed, the contained fiber will be interrupted. * * You can add a fiber to the handle using `FiberHandle.run`, and the fiber will * be automatically removed from the FiberHandle when it completes. * * @example * ```ts * import { Effect, FiberHandle } from "effect" * * Effect.gen(function*() { * const handle = yield* FiberHandle.make() * * // run some effects * yield* FiberHandle.run(handle, Effect.never) * // this will interrupt the previous fiber * yield* FiberHandle.run(handle, Effect.never) * * yield* Effect.sleep(1000) * }).pipe( * Effect.scoped // The fiber will be interrupted when the scope is closed * ) * ``` * * @since 2.0.0 * @category constructors */ export declare const make: () => Effect.Effect, never, Scope.Scope>; /** * Create an Effect run function that is backed by a FiberHandle. * * @example * ```ts * import { Effect, Fiber, FiberHandle } from "effect" * * Effect.gen(function*() { * const run = yield* FiberHandle.makeRuntime() * * // Run effects and get fibers back * const fiberA = run(Effect.succeed("first")) * const fiberB = run(Effect.succeed("second")) * * // The second fiber will interrupt the first * const resultA = yield* Fiber.await(fiberA) * const resultB = yield* Fiber.await(fiberB) * }).pipe(Effect.scoped) * ``` * * @since 2.0.0 * @category constructors */ export declare const makeRuntime: () => Effect.Effect<((effect: Effect.Effect, options?: { readonly signal?: AbortSignal | undefined; readonly scheduler?: Scheduler | undefined; readonly onlyIfMissing?: boolean | undefined; readonly propagateInterruption?: boolean | undefined; } | undefined) => Fiber.Fiber), never, Scope.Scope | R>; /** * Create an Effect run function that is backed by a FiberHandle. * * @example * ```ts * import { Effect, FiberHandle } from "effect" * * Effect.gen(function*() { * const run = yield* FiberHandle.makeRuntimePromise() * * // Run effects and get promises back * const promise = run(Effect.succeed("hello")) * const result = yield* Effect.promise(() => promise) * console.log(result) // "hello" * }).pipe(Effect.scoped) * ``` * * @since 3.13.0 * @category constructors */ export declare const makeRuntimePromise: () => Effect.Effect<((effect: Effect.Effect, options?: { readonly signal?: AbortSignal | undefined; readonly scheduler?: Scheduler | undefined; readonly onlyIfMissing?: boolean | undefined; readonly propagateInterruption?: boolean | undefined; } | undefined) => Promise), never, Scope.Scope | R>; /** * Set the fiber in a FiberHandle. When the fiber completes, it will be removed from the FiberHandle. * If a fiber is already running, it will be interrupted unless `options.onlyIfMissing` is set. * * @example * ```ts * import { Effect, Fiber, FiberHandle } from "effect" * * Effect.gen(function*() { * const handle = yield* FiberHandle.make() * const fiber = Effect.runFork(Effect.succeed("hello")) * * // Set the fiber directly (unsafe) * FiberHandle.setUnsafe(handle, fiber) * * // The fiber is now managed by the handle * const result = yield* Fiber.await(fiber) * console.log(result) // "hello" * }) * ``` * * @since 2.0.0 * @category combinators */ export declare const setUnsafe: { /** * Set the fiber in a FiberHandle. When the fiber completes, it will be removed from the FiberHandle. * If a fiber is already running, it will be interrupted unless `options.onlyIfMissing` is set. * * @example * ```ts * import { Effect, Fiber, FiberHandle } from "effect" * * Effect.gen(function*() { * const handle = yield* FiberHandle.make() * const fiber = Effect.runFork(Effect.succeed("hello")) * * // Set the fiber directly (unsafe) * FiberHandle.setUnsafe(handle, fiber) * * // The fiber is now managed by the handle * const result = yield* Fiber.await(fiber) * console.log(result) // "hello" * }) * ``` * * @since 2.0.0 * @category combinators */ (fiber: Fiber.Fiber, options?: { readonly onlyIfMissing?: boolean | undefined; readonly propagateInterruption?: boolean | undefined; }): (self: FiberHandle) => void; /** * Set the fiber in a FiberHandle. When the fiber completes, it will be removed from the FiberHandle. * If a fiber is already running, it will be interrupted unless `options.onlyIfMissing` is set. * * @example * ```ts * import { Effect, Fiber, FiberHandle } from "effect" * * Effect.gen(function*() { * const handle = yield* FiberHandle.make() * const fiber = Effect.runFork(Effect.succeed("hello")) * * // Set the fiber directly (unsafe) * FiberHandle.setUnsafe(handle, fiber) * * // The fiber is now managed by the handle * const result = yield* Fiber.await(fiber) * console.log(result) // "hello" * }) * ``` * * @since 2.0.0 * @category combinators */ (self: FiberHandle, fiber: Fiber.Fiber, options?: { readonly onlyIfMissing?: boolean | undefined; readonly propagateInterruption?: boolean | undefined; }): void; }; /** * Set the fiber in the `FiberHandle`. When the fiber completes, it will be * removed from the `FiberHandle`. * * If a fiber already exists in the `FiberHandle`, it will be interrupted * unless `options.onlyIfMissing` is set. * * @example * ```ts * import { Effect, Fiber, FiberHandle } from "effect" * * Effect.gen(function*() { * const handle = yield* FiberHandle.make() * const fiber = Effect.runFork(Effect.succeed("hello")) * * // Set the fiber safely * yield* FiberHandle.set(handle, fiber) * * // The fiber is now managed by the handle * const result = yield* Fiber.await(fiber) * console.log(result) // "hello" * }) * ``` * * @since 2.0.0 * @category combinators */ export declare const set: { /** * Set the fiber in the `FiberHandle`. When the fiber completes, it will be * removed from the `FiberHandle`. * * If a fiber already exists in the `FiberHandle`, it will be interrupted * unless `options.onlyIfMissing` is set. * * @example * ```ts * import { Effect, Fiber, FiberHandle } from "effect" * * Effect.gen(function*() { * const handle = yield* FiberHandle.make() * const fiber = Effect.runFork(Effect.succeed("hello")) * * // Set the fiber safely * yield* FiberHandle.set(handle, fiber) * * // The fiber is now managed by the handle * const result = yield* Fiber.await(fiber) * console.log(result) // "hello" * }) * ``` * * @since 2.0.0 * @category combinators */ (fiber: Fiber.Fiber, options?: { readonly onlyIfMissing?: boolean; readonly propagateInterruption?: boolean | undefined; }): (self: FiberHandle) => Effect.Effect; /** * Set the fiber in the `FiberHandle`. When the fiber completes, it will be * removed from the `FiberHandle`. * * If a fiber already exists in the `FiberHandle`, it will be interrupted * unless `options.onlyIfMissing` is set. * * @example * ```ts * import { Effect, Fiber, FiberHandle } from "effect" * * Effect.gen(function*() { * const handle = yield* FiberHandle.make() * const fiber = Effect.runFork(Effect.succeed("hello")) * * // Set the fiber safely * yield* FiberHandle.set(handle, fiber) * * // The fiber is now managed by the handle * const result = yield* Fiber.await(fiber) * console.log(result) // "hello" * }) * ``` * * @since 2.0.0 * @category combinators */ (self: FiberHandle, fiber: Fiber.Fiber, options?: { readonly onlyIfMissing?: boolean; readonly propagateInterruption?: boolean | undefined; }): Effect.Effect; }; /** * Retrieve the fiber from the FiberHandle. * * @example * ```ts * import { Effect, FiberHandle } from "effect" * * Effect.gen(function*() { * const handle = yield* FiberHandle.make() * * // No fiber initially * const emptyFiber = FiberHandle.getUnsafe(handle) * console.log(emptyFiber._tag === "None") // true * * // Add a fiber * yield* FiberHandle.run(handle, Effect.succeed("hello")) * const fiber = FiberHandle.getUnsafe(handle) * console.log(fiber._tag === "Some") // true * }) * ``` * * @since 2.0.0 * @category combinators */ export declare function getUnsafe(self: FiberHandle): Option.Option>; /** * Retrieve the fiber from the FiberHandle. * * @example * ```ts * import { Effect, Fiber, FiberHandle } from "effect" * * Effect.gen(function*() { * const handle = yield* FiberHandle.make() * * // Add a fiber * yield* FiberHandle.run(handle, Effect.succeed("hello")) * * // Get the current fiber if present * const fiber = yield* FiberHandle.get(handle) * if (fiber._tag === "Some") { * const result = yield* Fiber.await(fiber.value) * console.log(result) // "hello" * } * }) * ``` * * @since 2.0.0 * @category combinators */ export declare function get(self: FiberHandle): Effect.Effect>>; /** * @example * ```ts * import { Effect, FiberHandle } from "effect" * * Effect.gen(function*() { * const handle = yield* FiberHandle.make() * * // Add a fiber * yield* FiberHandle.run(handle, Effect.never) * * // Clear the handle, interrupting the fiber * yield* FiberHandle.clear(handle) * * // The handle is now empty * const fiber = FiberHandle.getUnsafe(handle) * console.log(fiber) // Option.none() * }) * ``` * * @since 2.0.0 * @category combinators */ export declare const clear: (self: FiberHandle) => Effect.Effect; /** * Run an Effect and add the forked fiber to the FiberHandle. * When the fiber completes, it will be removed from the FiberHandle. * * @example * ```ts * import { Effect, Fiber, FiberHandle } from "effect" * * Effect.gen(function*() { * const handle = yield* FiberHandle.make() * * // Run an effect and get the fiber * const fiber = yield* FiberHandle.run(handle, Effect.succeed("hello")) * const result = yield* Fiber.await(fiber) * console.log(result) // "hello" * * // Running another effect will interrupt the previous one * const fiber2 = yield* FiberHandle.run(handle, Effect.succeed("world")) * const result2 = yield* Fiber.await(fiber2) * console.log(result2) // "world" * }) * ``` * * @since 2.0.0 * @category combinators */ export declare const run: { /** * Run an Effect and add the forked fiber to the FiberHandle. * When the fiber completes, it will be removed from the FiberHandle. * * @example * ```ts * import { Effect, Fiber, FiberHandle } from "effect" * * Effect.gen(function*() { * const handle = yield* FiberHandle.make() * * // Run an effect and get the fiber * const fiber = yield* FiberHandle.run(handle, Effect.succeed("hello")) * const result = yield* Fiber.await(fiber) * console.log(result) // "hello" * * // Running another effect will interrupt the previous one * const fiber2 = yield* FiberHandle.run(handle, Effect.succeed("world")) * const result2 = yield* Fiber.await(fiber2) * console.log(result2) // "world" * }) * ``` * * @since 2.0.0 * @category combinators */ (self: FiberHandle, options?: { readonly onlyIfMissing?: boolean; readonly propagateInterruption?: boolean | undefined; readonly startImmediately?: boolean | undefined; }): (effect: Effect.Effect) => Effect.Effect, never, R>; /** * Run an Effect and add the forked fiber to the FiberHandle. * When the fiber completes, it will be removed from the FiberHandle. * * @example * ```ts * import { Effect, Fiber, FiberHandle } from "effect" * * Effect.gen(function*() { * const handle = yield* FiberHandle.make() * * // Run an effect and get the fiber * const fiber = yield* FiberHandle.run(handle, Effect.succeed("hello")) * const result = yield* Fiber.await(fiber) * console.log(result) // "hello" * * // Running another effect will interrupt the previous one * const fiber2 = yield* FiberHandle.run(handle, Effect.succeed("world")) * const result2 = yield* Fiber.await(fiber2) * console.log(result2) // "world" * }) * ``` * * @since 2.0.0 * @category combinators */ (self: FiberHandle, effect: Effect.Effect, options?: { readonly onlyIfMissing?: boolean; readonly propagateInterruption?: boolean | undefined; readonly startImmediately?: boolean | undefined; }): Effect.Effect, never, R>; }; /** * Capture a Runtime and use it to fork Effect's, adding the forked fibers to the FiberHandle. * * @example * ```ts * import { Effect, FiberHandle, Context } from "effect" * * interface Users { * readonly _: unique symbol * } * const Users = Context.Service> * }>("Users") * * Effect.gen(function*() { * const handle = yield* FiberHandle.make() * const run = yield* FiberHandle.runtime(handle)() * * // run an effect and set the fiber in the handle * run(Effect.andThen(Users, (_) => _.getAll)) * * // this will interrupt the previous fiber * run(Effect.andThen(Users, (_) => _.getAll)) * }).pipe( * Effect.scoped // The fiber will be interrupted when the scope is closed * ) * ``` * * @since 2.0.0 * @category combinators */ export declare const runtime: (self: FiberHandle) => () => Effect.Effect<((effect: Effect.Effect, options?: { readonly signal?: AbortSignal | undefined; readonly scheduler?: Scheduler | undefined; readonly onlyIfMissing?: boolean | undefined; readonly propagateInterruption?: boolean | undefined; } | undefined) => Fiber.Fiber), never, R>; /** * Capture a Runtime and use it to fork Effect's, adding the forked fibers to the FiberHandle. * * The returned run function will return Promise's that will resolve when the * fiber completes. * * @example * ```ts * import { Effect, FiberHandle } from "effect" * * Effect.gen(function*() { * const handle = yield* FiberHandle.make() * const runPromise = yield* FiberHandle.runtimePromise(handle)() * * // Run an effect and get a promise * const promise = runPromise(Effect.succeed("hello")) * const result = yield* Effect.promise(() => promise) * console.log(result) // "hello" * }) * ``` * * @since 3.13.0 * @category combinators */ export declare const runtimePromise: (self: FiberHandle) => () => Effect.Effect<((effect: Effect.Effect, options?: { readonly signal?: AbortSignal | undefined; readonly scheduler?: Scheduler | undefined; readonly onlyIfMissing?: boolean | undefined; readonly propagateInterruption?: boolean | undefined; } | undefined) => Promise), never, R>; /** * If any of the Fiber's in the handle terminate with a failure, * the returned Effect will terminate with the first failure that occurred. * * @example * ```ts * import { Effect, FiberHandle } from "effect" * * Effect.gen(function*() { * const handle = yield* FiberHandle.make() * yield* FiberHandle.set(handle, Effect.runFork(Effect.fail("error"))) * * // parent fiber will fail with "error" * yield* FiberHandle.join(handle) * }) * ``` * * @since 2.0.0 * @category combinators */ export declare const join: (self: FiberHandle) => Effect.Effect; /** * Wait for the fiber in the FiberHandle to complete. * * @example * ```ts * import { Effect, FiberHandle } from "effect" * * Effect.gen(function*() { * const handle = yield* FiberHandle.make() * * // Start a long-running effect * yield* FiberHandle.run(handle, Effect.sleep(1000)) * * // Wait for the fiber to complete * yield* FiberHandle.awaitEmpty(handle) * * console.log("Fiber completed") * }) * ``` * * @since 3.13.0 * @category combinators */ export declare const awaitEmpty: (self: FiberHandle) => Effect.Effect; export {}; //# sourceMappingURL=FiberHandle.d.ts.map