UNPKG

@effect-ts/system

Version:

Effect-TS is a zero dependency set of libraries to write highly productive, purely functional TypeScript at scale.

52 lines (47 loc) 1.57 kB
// 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<Env, OutErr, OutElem, OutDone>( builder: CK.ChunkBuilder<OutElem> ): C.Channel<Env, OutErr, OutElem, OutDone, OutErr, never, OutDone> { 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<Env, InErr, InElem, InDone, OutErr, OutElem, OutDone>( self: C.Channel<Env, InErr, InElem, InDone, OutErr, OutElem, OutDone> ): C.Channel< Env, InErr, InElem, InDone, OutErr, never, Tp.Tuple<[CK.Chunk<OutElem>, OutDone]> > { return C.suspend(() => { const builder = CK.builder<OutElem>() return C.chain_(C.pipeTo_(self, doneCollectReader(builder)), (z) => C.succeedWith(() => Tp.tuple(builder.build(), z)) ) }) }