import type { ErasedExecutor } from "@effect/core/stream/Channel/ChannelExecutor" export const ChannelStateSym = Symbol.for("@effect/core/stream/Channel/ChannelState") export type ChannelStateSym = typeof ChannelStateSym export const _R = Symbol.for("@effect/core/stream/Channel/ChannelState/R") export type _R = typeof _R export const _E = Symbol.for("@effect/core/stream/Channel/ChannelState/E") export type _E = typeof _E /** * @tsplus type effect/core/stream/Channel/State */ export interface ChannelState { readonly [ChannelStateSym]: ChannelStateSym readonly [_R]: (_: R) => void readonly [_E]: () => E } export declare namespace ChannelState { type Done = ChannelStateDone type Emit = ChannelStateEmit type Effect = ChannelStateEffect type Read = ChannelStateRead } export abstract class ChannelStateBase implements ChannelState { readonly [ChannelStateSym]: ChannelStateSym = ChannelStateSym readonly [_R]!: (_: R) => void readonly [_E]!: () => E } export class ChannelStateDone extends ChannelStateBase { readonly _tag = "Done" } export class ChannelStateEmit extends ChannelStateBase { readonly _tag = "Emit" } export class ChannelStateEffect extends ChannelStateBase { readonly _tag = "Effect" constructor(readonly effect: Effect) { super() } } export class ChannelStateRead extends ChannelStateBase { readonly _tag = "Read" constructor( readonly upstream: ErasedExecutor, readonly onEffect: (_: Effect) => Effect, readonly onEmit: (_: unknown) => Effect | undefined, readonly onDone: (_: Exit) => Effect | undefined ) { super() } } /** * @tsplus type effect/core/stream/Channel/State.Ops */ export interface ChannelStateOps {} export const ChannelState: ChannelStateOps = {} /** * @tsplus unify effect/core/stream/Channel/State */ export function unifyChannelState>( self: X ): ChannelState< [X] extends [{ [_R]: () => infer R }] ? R : never, [X] extends [{ [_E]: () => infer E }] ? E : never > { return self } /** * @tsplus macro remove */ export function concreteChannelState( _: ChannelState ): asserts _ is | ChannelStateDone | ChannelStateEmit | ChannelStateEffect | ChannelStateRead { // } /** * @tsplus static effect/core/stream/Channel/State.Ops Done */ export const channelStateDone: ChannelState = new ChannelStateDone() /** * @tsplus static effect/core/stream/Channel/State.Ops Emit */ export const channelStateEmit: ChannelState = new ChannelStateEmit() /** * @tsplus static effect/core/stream/Channel/State.Ops Effect */ export function channelStateEffect( effect: Effect ): ChannelState { return new ChannelStateEffect(effect) } /** * @tsplus static effect/core/stream/Channel/State.Ops Read */ export function channelStateRead( upstream: ErasedExecutor, onEffect: (_: Effect) => Effect, onEmit: (_: unknown) => Effect | undefined, onDone: (_: Exit) => Effect | undefined ): ChannelState { return new ChannelStateRead(upstream, onEffect, onEmit, onDone) } /** * @tsplus fluent effect/core/stream/Channel/State effectOrUnit */ export function effectOrUnit( self: ChannelState ): Effect { concreteChannelState(self) return self._tag === "Effect" ? self.effect : Effect.unit } /** * @tsplus fluent effect/core/stream/Channel/State effectOrUndefinedIgnored */ export function effectOrUndefinedIgnored( self: ChannelState ): Effect | undefined { concreteChannelState(self) return self._tag === "Effect" ? self.effect.ignore.unit : undefined }