| 2254 | |
| 2255 | /** @internal */ |
| 2256 | const interpretToPull = <Env, InErr, InElem, InDone, OutErr, OutElem, OutDone>( |
| 2257 | channelState: ChannelState.ChannelState<OutErr, Env>, |
| 2258 | exec: executor.ChannelExecutor<OutElem, InElem, OutErr, InErr, OutDone, InDone, Env> |
| 2259 | ): Effect.Effect<Either.Either<OutElem, OutDone>, OutErr, Env> => { |
| 2260 | const state = channelState as ChannelState.Primitive |
| 2261 | switch (state._tag) { |
| 2262 | case ChannelStateOpCodes.OP_DONE: { |
| 2263 | return Exit.match(exec.getDone(), { |
| 2264 | onFailure: Effect.failCause, |
| 2265 | onSuccess: (done): Effect.Effect<Either.Either<OutElem, OutDone>, OutErr, Env> => |
| 2266 | Effect.succeed(Either.left(done)) |
| 2267 | }) |
| 2268 | } |
| 2269 | case ChannelStateOpCodes.OP_EMIT: { |
| 2270 | return Effect.succeed(Either.right(exec.getEmit())) |
| 2271 | } |
| 2272 | case ChannelStateOpCodes.OP_FROM_EFFECT: { |
| 2273 | return pipe( |
| 2274 | state.effect as Effect.Effect<Either.Either<OutElem, OutDone>, OutErr, Env>, |
| 2275 | Effect.flatMap(() => interpretToPull(exec.run() as ChannelState.ChannelState<OutErr, Env>, exec)) |
| 2276 | ) |
| 2277 | } |
| 2278 | case ChannelStateOpCodes.OP_READ: { |
| 2279 | return executor.readUpstream( |
| 2280 | state, |
| 2281 | () => interpretToPull(exec.run() as ChannelState.ChannelState<OutErr, Env>, exec), |
| 2282 | (cause) => Effect.failCause(cause) as Effect.Effect<Either.Either<OutElem, OutDone>, OutErr, Env> |
| 2283 | ) |
| 2284 | } |
| 2285 | } |
| 2286 | } |
| 2287 | |
| 2288 | /** @internal */ |
| 2289 | export const toQueue = <Done, Err, Elem>( |