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* in out */ A, /* in out */ E> = 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 }
}