/** * @since 1.0.0 */ import type * as Deferred from "effect/Deferred" import type * as Effect from "effect/Effect" import { type Pipeable, pipeArguments } from "effect/Pipeable" import * as Predicate from "effect/Predicate" import type { Request } from "effect/Request" import type * as Schema from "effect/Schema" /** * @since 1.0.0 * @category type ids */ export const TypeId: unique symbol = Symbol.for("@effect/experimental/Machine/Procedure") /** * @since 1.0.0 * @category type ids */ export type TypeId = typeof TypeId /** * @since 1.0.0 * @category models */ export interface TaggedRequest extends Request { readonly _tag: Tag } /** * @since 1.0.0 * @category models */ export declare namespace TaggedRequest { /** * @since 1.0.0 * @category models */ export type Any = | TaggedRequest | TaggedRequest } /** * @since 1.0.0 * @category models */ export interface Procedure extends Pipeable { readonly [TypeId]: TypeId readonly tag: Request["_tag"] readonly handler: Handler } /** * @since 1.0.0 * @category type ids */ export const SerializableTypeId: unique symbol = Symbol.for("@effect/experimental/Machine/SerializableProcedure") /** * @since 1.0.0 * @category type ids */ export type SerializableTypeId = typeof SerializableTypeId /** * @since 1.0.0 * @category refinements */ export const isSerializable = (u: unknown): u is SerializableProcedure => Predicate.hasProperty(u, SerializableTypeId) /** * @since 1.0.0 * @category models */ export interface SerializableProcedure extends Procedure { readonly [SerializableTypeId]: SerializableTypeId readonly schema: Schema.Schema } /** * @since 1.0.0 * @category symbols */ export const NoReply = Symbol.for("@effect/experimental/Machine/Procedure/NoReply") /** * @since 1.0.0 * @category symbols */ export type NoReply = typeof NoReply /** * @since 1.0.0 * @category models */ export type Handler< Request extends TaggedRequest.Any, State, Requests extends TaggedRequest.Any, R > = ( context: Procedure.Context ) => Effect.Effect< readonly [response: Request.Success | NoReply, state: State], Request.Error, R > /** * @since 1.0.0 * @category models */ export declare namespace Procedure { /** * @since 1.0.0 * @category models */ export interface BaseContext { readonly fork: (effect: Effect.Effect) => Effect.Effect readonly forkOne: { (id: string): (effect: Effect.Effect) => Effect.Effect (effect: Effect.Effect, id: string): Effect.Effect } readonly forkReplace: { (id: string): (effect: Effect.Effect) => Effect.Effect (effect: Effect.Effect, id: string): Effect.Effect } readonly unsafeSend: (request: Req) => Effect.Effect readonly unsafeSendAwait: (request: Req) => Effect.Effect< Request.Success, Request.Error > } /** * @since 1.0.0 * @category models */ export interface ContextProto extends BaseContext { readonly send: (request: Req) => Effect.Effect readonly sendAwait: (request: Req) => Effect.Effect< Request.Success, Request.Error > readonly forkWith: { (state: State): ( effect: Effect.Effect ) => Effect.Effect ( effect: Effect.Effect, state: State ): Effect.Effect } readonly forkOneWith: { ( id: string, state: State ): (effect: Effect.Effect) => Effect.Effect ( effect: Effect.Effect, id: string, state: State ): Effect.Effect } readonly forkReplaceWith: { ( id: string, state: State ): (effect: Effect.Effect) => Effect.Effect ( effect: Effect.Effect, id: string, state: State ): Effect.Effect } } /** * @since 1.0.0 * @category models */ export interface Context extends ContextProto { readonly request: Request readonly state: State readonly deferred: Deferred.Deferred< Request.Success, Request.Error > } /** * @since 1.0.0 * @category models */ export type InferRequest

= P extends Procedure ? Req : never /** * @since 1.0.0 * @category models */ export type InferContext

= P extends Procedure ? R : never } /** * @since 1.0.0 * @category constructors */ export const make = () => () => ( tag: Req["_tag"], handler: Handler ): Procedure => ({ [TypeId]: TypeId, handler, tag, pipe() { return pipeArguments(this, arguments) } }) /** * @since 1.0.0 * @category constructors */ export const makeSerializable = < Requests extends TaggedRequest.Any, State >() => < Req extends Schema.TaggedRequest.All, IS, R, RS >( schema: Schema.Schema & { readonly _tag: Req["_tag"] }, handler: Handler ): SerializableProcedure> => ({ [TypeId]: TypeId, [SerializableTypeId]: SerializableTypeId, schema: schema as any, handler, tag: schema._tag, pipe() { return pipeArguments(this, arguments) } })