export const MergeDecisionSym = Symbol.for("@effect/core/stream/Channel/MergeDecision") export type MergeDecisionSym = typeof MergeDecisionSym export const _R = Symbol.for("@effect/core/stream/Channel/MergeDecision/R") export type _R = typeof _R export const _E0 = Symbol.for("@effect/core/stream/Channel/MergeDecision/E0") export type _E0 = typeof _E0 export const _Z0 = Symbol.for("@effect/core/stream/Channel/MergeDecision/Z0") export type _Z0 = typeof _Z0 export const _E = Symbol.for("@effect/core/stream/Channel/MergeDecision/E") export type _E = typeof _E export const _Z = Symbol.for("@effect/core/stream/Channel/MergeDecision/Z") export type _Z = typeof _Z /** * @tsplus type effect/core/stream/Channel/MergeDecision */ export interface MergeDecision { readonly [MergeDecisionSym]: typeof MergeDecisionSym readonly [_R]: () => R readonly [_E0]: (_: E0) => void readonly [_Z0]: (_: Z0) => void readonly [_E]: () => E readonly [_Z]: () => Z } /** * @tsplus type effect/core/stream/Channel/MergeDecision.Ops */ export interface MergeDecisionOps {} export const MergeDecision: MergeDecisionOps = {} export abstract class MergeDecisionBase implements MergeDecision { readonly [MergeDecisionSym]: typeof MergeDecisionSym = MergeDecisionSym readonly [_R]!: () => R readonly [_E0]!: (_: E0) => void readonly [_Z0]!: (_: Z0) => void readonly [_E]!: () => E readonly [_Z]!: () => Z } /** * @tsplus unify effect/core/stream/Channel/MergeDecision */ export function unifyMergeDecision>( self: X ): MergeDecision< [X] extends [{ [k in typeof _R]: () => infer R }] ? R : never, [X] extends [{ [k in typeof _E0]: (_: infer E0) => void }] ? E0 : never, [X] extends [{ [k in typeof _Z0]: (_: infer Z0) => void }] ? Z0 : never, [X] extends [{ [k in typeof _E]: () => infer E }] ? E : never, [X] extends [{ [k in typeof _Z]: () => infer A }] ? A : never > { return self } export class Done extends MergeDecisionBase { readonly _tag = "Done" constructor(readonly io: Effect) { super() } } export class Await extends MergeDecisionBase { readonly _tag = "Await" constructor(readonly f: (ex: Exit) => Effect) { super() } } /** * @tsplus static effect/core/stream/Channel/MergeDecision.Ops done */ export function done( io: Effect ): MergeDecision { return new Done(io) } /** * @tsplus static effect/core/stream/Channel/MergeDecision.Ops await */ export function _await( f: (ex: Exit) => Effect ): MergeDecision { return new Await(f) } /** * @tsplus static effect/core/stream/Channel/MergeDecision.Ops awaitConst */ export function awaitConst( io: Effect ): MergeDecision { return new Await((_) => io) } /** * @tsplus macro remove */ export function concreteMergeDecision( _: MergeDecision ): asserts _ is Done | Await { // }