import type * as Deferred from "../Deferred.js" import type * as Effect from "../Effect.js" import * as OpCodes from "./opCodes/deferred.js" /** @internal */ const DeferredSymbolKey = "effect/Deferred" /** @internal */ export const DeferredTypeId: Deferred.DeferredTypeId = Symbol.for( DeferredSymbolKey ) as Deferred.DeferredTypeId /** @internal */ export const deferredVariance = { /* c8 ignore next */ _E: (_: any) => _, /* c8 ignore next */ _A: (_: any) => _ } /** @internal */ export type State = Pending | Done /** @internal */ export interface Pending { readonly _tag: "Pending" readonly joiners: Array<(effect: Effect.Effect) => void> } /** @internal */ export interface Done { readonly _tag: "Done" readonly effect: Effect.Effect } /** @internal */ export const pending = ( joiners: Array<(effect: Effect.Effect) => void> ): State => { return { _tag: OpCodes.OP_STATE_PENDING, joiners } } /** @internal */ export const done = (effect: Effect.Effect): State => { return { _tag: OpCodes.OP_STATE_DONE, effect } }