import type * as Effect from "../../Effect.js" import type * as Either from "../../Either.js" import type * as Exit from "../../Exit.js" import type * as Fiber from "../../Fiber.js" import { dual } from "../../Function.js" import type * as MergeState from "../../MergeState.js" import { hasProperty } from "../../Predicate.js" import * as OpCodes from "../opCodes/channelMergeState.js" /** @internal */ const MergeStateSymbolKey = "effect/ChannelMergeState" /** @internal */ export const MergeStateTypeId: MergeState.MergeStateTypeId = Symbol.for( MergeStateSymbolKey ) as MergeState.MergeStateTypeId /** @internal */ const proto = { [MergeStateTypeId]: MergeStateTypeId } /** @internal */ export const BothRunning = ( left: Fiber.Fiber, Err>, right: Fiber.Fiber, Err1> ): MergeState.MergeState => { const op = Object.create(proto) op._tag = OpCodes.OP_BOTH_RUNNING op.left = left op.right = right return op } /** @internal */ export const LeftDone = ( f: (exit: Exit.Exit) => Effect.Effect ): MergeState.MergeState => { const op = Object.create(proto) op._tag = OpCodes.OP_LEFT_DONE op.f = f return op } /** @internal */ export const RightDone = ( f: (exit: Exit.Exit) => Effect.Effect ): MergeState.MergeState => { const op = Object.create(proto) op._tag = OpCodes.OP_RIGHT_DONE op.f = f return op } /** @internal */ export const isMergeState = ( u: unknown ): u is MergeState.MergeState => hasProperty(u, MergeStateTypeId) /** @internal */ export const isBothRunning = ( self: MergeState.MergeState ): self is MergeState.BothRunning => { return self._tag === OpCodes.OP_BOTH_RUNNING } /** @internal */ export const isLeftDone = ( self: MergeState.MergeState ): self is MergeState.LeftDone => { return self._tag === OpCodes.OP_LEFT_DONE } /** @internal */ export const isRightDone = ( self: MergeState.MergeState ): self is MergeState.RightDone => { return self._tag === OpCodes.OP_RIGHT_DONE } /** @internal */ export const match = dual< ( options: { readonly onBothRunning: ( left: Fiber.Fiber, Err>, right: Fiber.Fiber, Err1> ) => Z readonly onLeftDone: (f: (exit: Exit.Exit) => Effect.Effect) => Z readonly onRightDone: (f: (exit: Exit.Exit) => Effect.Effect) => Z } ) => (self: MergeState.MergeState) => Z, ( self: MergeState.MergeState, options: { readonly onBothRunning: ( left: Fiber.Fiber, Err>, right: Fiber.Fiber, Err1> ) => Z readonly onLeftDone: (f: (exit: Exit.Exit) => Effect.Effect) => Z readonly onRightDone: (f: (exit: Exit.Exit) => Effect.Effect) => Z } ) => Z >(2, ( self, { onBothRunning, onLeftDone, onRightDone } ) => { switch (self._tag) { case OpCodes.OP_BOTH_RUNNING: { return onBothRunning(self.left, self.right) } case OpCodes.OP_LEFT_DONE: { return onLeftDone(self.f) } case OpCodes.OP_RIGHT_DONE: { return onRightDone(self.f) } } })