import { concreteStream, StreamInternal } from "@effect/core/stream/Stream/operations/_internal/StreamInternal" /** * Intersperse stream with provided element. * * @tsplus static effect/core/stream/Stream.Aspects intersperse * @tsplus pipeable effect/core/stream/Stream intersperse */ export function intersperse(middle: A2) { return (self: Stream): Stream => { concreteStream(self) return new StreamInternal(self.channel >> writer(middle, true)) } } function writer( middle: A2, isFirst: boolean ): Channel, unknown, E, Chunk, void> { return Channel.readWith( (chunk: Chunk) => { const builder = Chunk.builder() let flagResult = isFirst chunk.forEach((value) => { if (flagResult) { flagResult = false builder.append(value) } else { builder.append(middle) builder.append(value) } }) return Channel.write(builder.build()).flatMap(() => writer(middle, flagResult)) }, (err) => Channel.fail(err), () => Channel.unit ) }