// ets_tracing: off import * as CK from "../../../../Collections/Immutable/Chunk/index.js" import * as Tp from "../../../../Collections/Immutable/Tuple/index.js" import * as C from "../core.js" import * as ReadWith from "./readWith.js" import * as ZipRight from "./zipRight.js" function doneCollectReader( builder: CK.ChunkBuilder ): C.Channel { return ReadWith.readWith( (out) => ZipRight.zipRight_( C.succeedWith(() => { builder.append(out) }), doneCollectReader(builder) ), (err) => C.fail(err), (done) => C.end(done) ) } /** * Returns a new channel, which is the same as this one, except that all the outputs are * collected and bundled into a tuple together with the terminal value of this channel. * * As the channel returned from this channel collect's all of this channel's output into an in- * memory chunk, it is not safe to call this method on channels that output a large or unbounded * number of values. */ export function doneCollect( self: C.Channel ): C.Channel< Env, InErr, InElem, InDone, OutErr, never, Tp.Tuple<[CK.Chunk, OutDone]> > { return C.suspend(() => { const builder = CK.builder() return C.chain_(C.pipeTo_(self, doneCollectReader(builder)), (z) => C.succeedWith(() => Tp.tuple(builder.build(), z)) ) }) }