import { dual } from "../../Function.js" import { hasProperty } from "../../Predicate.js" import type * as UpstreamPullRequest from "../../UpstreamPullRequest.js" import * as OpCodes from "../opCodes/channelUpstreamPullRequest.js" /** @internal */ const UpstreamPullRequestSymbolKey = "effect/ChannelUpstreamPullRequest" /** @internal */ export const UpstreamPullRequestTypeId: UpstreamPullRequest.UpstreamPullRequestTypeId = Symbol.for( UpstreamPullRequestSymbolKey ) as UpstreamPullRequest.UpstreamPullRequestTypeId const upstreamPullRequestVariance = { /* c8 ignore next */ _A: (_: never) => _ } /** @internal */ const proto = { [UpstreamPullRequestTypeId]: upstreamPullRequestVariance } /** @internal */ export const Pulled = (value: A): UpstreamPullRequest.UpstreamPullRequest => { const op = Object.create(proto) op._tag = OpCodes.OP_PULLED op.value = value return op } /** @internal */ export const NoUpstream = (activeDownstreamCount: number): UpstreamPullRequest.UpstreamPullRequest => { const op = Object.create(proto) op._tag = OpCodes.OP_NO_UPSTREAM op.activeDownstreamCount = activeDownstreamCount return op } /** @internal */ export const isUpstreamPullRequest = (u: unknown): u is UpstreamPullRequest.UpstreamPullRequest => hasProperty(u, UpstreamPullRequestTypeId) /** @internal */ export const isPulled = ( self: UpstreamPullRequest.UpstreamPullRequest ): self is UpstreamPullRequest.Pulled => self._tag === OpCodes.OP_PULLED /** @internal */ export const isNoUpstream = ( self: UpstreamPullRequest.UpstreamPullRequest ): self is UpstreamPullRequest.NoUpstream => self._tag === OpCodes.OP_NO_UPSTREAM /** @internal */ export const match = dual< ( options: { readonly onPulled: (value: A) => Z readonly onNoUpstream: (activeDownstreamCount: number) => Z } ) => (self: UpstreamPullRequest.UpstreamPullRequest) => Z, ( self: UpstreamPullRequest.UpstreamPullRequest, options: { readonly onPulled: (value: A) => Z readonly onNoUpstream: (activeDownstreamCount: number) => Z } ) => Z >(2, ( self: UpstreamPullRequest.UpstreamPullRequest, { onNoUpstream, onPulled }: { readonly onPulled: (value: A) => Z readonly onNoUpstream: (activeDownstreamCount: number) => Z } ): Z => { switch (self._tag) { case OpCodes.OP_PULLED: { return onPulled(self.value) } case OpCodes.OP_NO_UPSTREAM: { return onNoUpstream(self.activeDownstreamCount) } } })