import { concreteStream, StreamInternal } from "@effect/core/stream/Stream/operations/_internal/StreamInternal" /** * Unwraps `Exit` values that also signify end-of-stream by failing with `None`. * * For `Exit` values that do not signal end-of-stream, prefer: * * ```typescript * stream.mapEffect((exit) => Effect.done(exit)) * ``` * * @tsplus getter effect/core/stream/Stream flattenExitMaybe */ export function flattenExitMaybe( self: Stream, A>> ): Stream { const process: Channel< R, E, Chunk, A>>, unknown, E, Chunk, unknown > = Channel.readWithCause( (chunk: Chunk, A>>) => processChunk(chunk, process), (cause) => Channel.failCause(cause), () => Channel.unit ) concreteStream(self) return new StreamInternal(self.channel >> process) } function processChunk( chunk: Chunk, A>>, cont: Channel, A>>, unknown, E, Chunk, unknown> ): Channel, A>>, unknown, E, Chunk, unknown> { const [toEmit, rest] = chunk.splitWhere((exit) => !exit.isSuccess()) const next = rest.head.fold(cont, (exit) => exit.fold( (cause) => Cause.flipCauseMaybe(cause).fold(Channel.unit, (cause) => Channel.failCause(cause)), () => Channel.unit )) return ( Channel.write( toEmit.collect((exit) => exit.isSuccess() ? Maybe.some(exit.value) : Maybe.none) ).flatMap(() => next) ) }