Hyperlinkv0.8.0-beta.28

Channel

Channel.runFoldEffectconsteffect/Channel.ts:7985
<OutElem, Z, E, R>(
  initial: LazyArg<Z>,
  f: (acc: Z, o: OutElem) => Effect.Effect<Z, E, R>
): <OutErr, OutDone, Env>(
  self: Channel<OutElem, OutErr, OutDone, unknown, unknown, unknown, Env>
) => Effect.Effect<Z, OutErr | E, Env | R>
<OutElem, OutErr, OutDone, Env, Z, E, R>(
  self: Channel<OutElem, OutErr, OutDone, unknown, unknown, unknown, Env>,
  initial: LazyArg<Z>,
  f: (acc: Z, o: OutElem) => Effect.Effect<Z, E, R>
): Effect.Effect<Z, OutErr | E, Env | R>

Runs a channel and effectfully folds all output elements with an accumulator.

When to use

Use when folding channel output needs effects, services, or an additional failure channel during accumulation.

Details

The initial accumulator is evaluated lazily. Each output element is passed to the effectful accumulator function. The returned effect succeeds with the final accumulator value.

execution
Source effect/Channel.ts:798535 lines
export const runFoldEffect: {
  <OutElem, Z, E, R>(
    initial: LazyArg<Z>,
    f: (acc: Z, o: OutElem) => Effect.Effect<Z, E, R>
  ): <OutErr, OutDone, Env>(
    self: Channel<OutElem, OutErr, OutDone, unknown, unknown, unknown, Env>
  ) => Effect.Effect<Z, OutErr | E, Env | R>
  <OutElem, OutErr, OutDone, Env, Z, E, R>(
    self: Channel<OutElem, OutErr, OutDone, unknown, unknown, unknown, Env>,
    initial: LazyArg<Z>,
    f: (acc: Z, o: OutElem) => Effect.Effect<Z, E, R>
  ): Effect.Effect<Z, OutErr | E, Env | R>
} = dual(3, <OutElem, OutErr, OutDone, Env, Z, E, R>(
  self: Channel<OutElem, OutErr, OutDone, unknown, unknown, unknown, Env>,
  initial: LazyArg<Z>,
  f: (acc: Z, o: OutElem) => Effect.Effect<Z, E, R>
): Effect.Effect<Z, OutErr | E, Env | R> =>
  Effect.suspend(() => {
    let state = initial()
    return runWith(
      self,
      (pull) =>
        Effect.whileLoop({
          while: constTrue,
          body: constant(pull.pipe(
            Effect.flatMap((o) => f(state, o)),
            Effect.map((s) => {
              state = s
            })
          )),
          step: constVoid
        }),
      () => Effect.succeed(state)
    )
  }))
Referenced by 1 symbols