/** * @since 2.0.0 */ import type * as _Cache from "./Cache.js" import type { Cause } from "./Cause.js" import type { Deferred } from "./Deferred.js" import type { DurationInput } from "./Duration.js" import type * as Effect from "./Effect.js" import type * as Exit from "./Exit.js" import type { FiberId } from "./FiberId.js" import * as RequestBlock_ from "./internal/blockedRequests.js" import * as cache from "./internal/cache.js" import * as core from "./internal/core.js" import * as fiberRuntime from "./internal/fiberRuntime.js" import * as internal from "./internal/request.js" import type * as Option from "./Option.js" import type * as Types from "./Types.js" /** * @since 2.0.0 * @category symbols */ export const RequestTypeId: unique symbol = internal.RequestTypeId /** * @since 2.0.0 * @category symbols */ export type RequestTypeId = typeof RequestTypeId /** * A `Request` is a request from a data source for a value of type `A` * that may fail with an `E`. * * @since 2.0.0 * @category models */ export interface Request extends Request.Variance {} /** * @since 2.0.0 */ export declare namespace Request { /** * @since 2.0.0 * @category models */ export interface Variance { readonly [RequestTypeId]: { readonly _A: Types.Covariant readonly _E: Types.Covariant } } /** * @since 2.0.0 * @category models */ export interface Constructor, T extends keyof R = never> { (args: Omit, Request.Error>)>): R } /** * A utility type to extract the error type from a `Request`. * * @since 2.0.0 * @category type-level */ export type Error> = [T] extends [Request] ? _E : never /** * A utility type to extract the value type from a `Request`. * * @since 2.0.0 * @category type-level */ export type Success> = [T] extends [Request] ? _A : never /** * A utility type to extract the result type from a `Request`. * * @since 2.0.0 * @category type-level */ export type Result> = T extends Request ? Exit.Exit : never /** * A utility type to extract the optional result type from a `Request`. * * @since 2.0.0 * @category type-level */ export type OptionalResult> = T extends Request ? Exit.Exit, E> : never } /** * Returns `true` if the specified value is a `Request`, `false` otherwise. * * @since 2.0.0 * @category refinements */ export const isRequest: (u: unknown) => u is Request = internal.isRequest /** * Constructs a new `Request`. * * @since 2.0.0 * @category constructors */ export const of: >() => Request.Constructor = internal.of /** * Constructs a new `Request`. * * @since 2.0.0 * @category constructors */ export const tagged: & { _tag: string }>( tag: R["_tag"] ) => Request.Constructor = internal.tagged /** * Provides a constructor for a Request Class. * * @example * ```ts * import { Request } from "effect" * * type Success = string * type Error = never * * class MyRequest extends Request.Class {} * ``` * * @since 2.0.0 * @category constructors */ export const Class: new>( args: Types.Equals>, {}> extends true ? void : { readonly [P in keyof A as P extends keyof Request ? never : P]: A[P] } ) => Request & Readonly = internal.Class as any /** * Provides a Tagged constructor for a Request Class. * * @example * ```ts * import { Request } from "effect" * * type Success = string * type Error = never * * class MyRequest extends Request.TaggedClass("MyRequest") {} * ``` * * @since 2.0.0 * @category constructors */ export const TaggedClass: ( tag: Tag ) => new>( args: Types.Equals>, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" | keyof Request ? never : P]: A[P] } ) => Request & Readonly & { readonly _tag: Tag } = internal.TaggedClass as any /** * Complete a `Request` with the specified result. * * @since 2.0.0 * @category request completion */ export const complete: { /** * Complete a `Request` with the specified result. * * @since 2.0.0 * @category request completion */ >(result: Request.Result): (self: A) => Effect.Effect /** * Complete a `Request` with the specified result. * * @since 2.0.0 * @category request completion */ >(self: A, result: Request.Result): Effect.Effect } = internal.complete /** * Interrupts the child effect when requests are no longer needed * * @since 2.0.0 * @category request completion */ export const interruptWhenPossible: { /** * Interrupts the child effect when requests are no longer needed * * @since 2.0.0 * @category request completion */ (all: Iterable>): (self: Effect.Effect) => Effect.Effect /** * Interrupts the child effect when requests are no longer needed * * @since 2.0.0 * @category request completion */ (self: Effect.Effect, all: Iterable>): Effect.Effect } = fiberRuntime.interruptWhenPossible /** * Complete a `Request` with the specified effectful computation, failing the * request with the error from the effect workflow if it fails, and completing * the request with the value of the effect workflow if it succeeds. * * @since 2.0.0 * @category request completion */ export const completeEffect: { /** * Complete a `Request` with the specified effectful computation, failing the * request with the error from the effect workflow if it fails, and completing * the request with the value of the effect workflow if it succeeds. * * @since 2.0.0 * @category request completion */ , R>(effect: Effect.Effect, Request.Error, R>): (self: A) => Effect.Effect /** * Complete a `Request` with the specified effectful computation, failing the * request with the error from the effect workflow if it fails, and completing * the request with the value of the effect workflow if it succeeds. * * @since 2.0.0 * @category request completion */ , R>(self: A, effect: Effect.Effect, Request.Error, R>): Effect.Effect } = internal.completeEffect /** * Complete a `Request` with the specified error. * * @since 2.0.0 * @category request completion */ export const fail: { /** * Complete a `Request` with the specified error. * * @since 2.0.0 * @category request completion */ >(error: Request.Error): (self: A) => Effect.Effect /** * Complete a `Request` with the specified error. * * @since 2.0.0 * @category request completion */ >(self: A, error: Request.Error): Effect.Effect } = internal.fail /** * Complete a `Request` with the specified cause. * * @since 2.0.0 * @category request completion */ export const failCause: { /** * Complete a `Request` with the specified cause. * * @since 2.0.0 * @category request completion */ >(cause: Cause>): (self: A) => Effect.Effect /** * Complete a `Request` with the specified cause. * * @since 2.0.0 * @category request completion */ >(self: A, cause: Cause>): Effect.Effect } = internal.failCause /** * Complete a `Request` with the specified value. * * @since 2.0.0 * @category request completion */ export const succeed: { /** * Complete a `Request` with the specified value. * * @since 2.0.0 * @category request completion */ >(value: Request.Success): (self: A) => Effect.Effect /** * Complete a `Request` with the specified value. * * @since 2.0.0 * @category request completion */ >(self: A, value: Request.Success): Effect.Effect } = internal.succeed /** * @category models * @since 2.0.0 */ export interface Listeners { readonly count: number readonly observers: Set<(count: number) => void> interrupted: boolean addObserver(f: (count: number) => void): void removeObserver(f: (count: number) => void): void increment(): void decrement(): void } /** * @category models * @since 2.0.0 */ export interface Cache extends _Cache.ConsumerCache, { listeners: Listeners handle: Deferred }> {} /** * @since 2.0.0 * @category models */ export const makeCache = ( options: { readonly capacity: number readonly timeToLive: DurationInput } ): Effect.Effect => cache.make({ ...options, lookup: () => core.map(core.deferredMake(), (handle) => ({ listeners: new internal.Listeners(), handle })) }) /** * @since 2.0.0 * @category symbols */ export const EntryTypeId: unique symbol = Symbol.for("effect/RequestBlock.Entry") /** * @since 2.0.0 * @category symbols */ export type EntryTypeId = typeof EntryTypeId /** * A `Entry` keeps track of a request of type `A` along with a * `Ref` containing the result of the request, existentially hiding the result * type. This is used internally by the library to support data sources that * return different result types for different requests while guaranteeing that * results will be of the type requested. * * @since 2.0.0 * @category models */ export interface Entry extends Entry.Variance { readonly request: R readonly result: Deferred< [R] extends [Request] ? _A : never, [R] extends [Request] ? _E : never > readonly listeners: Listeners readonly ownerId: FiberId readonly state: { completed: boolean } } /** * @since 2.0.0 * @category models */ export declare namespace Entry { /** * @since 2.0.0 * @category models */ export interface Variance { readonly [EntryTypeId]: { readonly _R: Types.Covariant } } } /** * @since 2.0.0 * @category guards */ export const isEntry = RequestBlock_.isEntry /** * @since 2.0.0 * @category constructors */ export const makeEntry = RequestBlock_.makeEntry