Hyperlinkv0.8.0-beta.28

Channel

Channel.onFirstconsteffect/Channel.ts:7050
<OutElem, A, E, R>(
  onFirst: (element: Types.NoInfer<OutElem>) => Effect.Effect<A, E, R>
): <OutErr, OutDone, InElem, InErr, InDone, Env>(
  self: Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>
) => Channel<OutElem, OutErr | E, OutDone, InElem, InErr, InDone, Env | R>
<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env, A, E, R>(
  self: Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>,
  onFirst: (element: Types.NoInfer<OutElem>) => Effect.Effect<A, E, R>
): Channel<OutElem, OutErr | E, OutDone, InElem, InErr, InDone, Env | R>

Runs an effect the first time the channel emits an output element.

When to use

Use when initialization depends on the first output element rather than only on channel startup.

Details

The effect receives the first emitted element. The first element is still emitted unchanged. The effect is not run if the channel completes without emitting an element.

hooks
Source effect/Channel.ts:705023 lines
export const onFirst: {
  <OutElem, A, E, R>(
    onFirst: (element: Types.NoInfer<OutElem>) => Effect.Effect<A, E, R>
  ): <OutErr, OutDone, InElem, InErr, InDone, Env>(
    self: Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>
  ) => Channel<OutElem, OutErr | E, OutDone, InElem, InErr, InDone, Env | R>
  <OutElem, OutErr, OutDone, InElem, InErr, InDone, Env, A, E, R>(
    self: Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>,
    onFirst: (element: Types.NoInfer<OutElem>) => Effect.Effect<A, E, R>
  ): Channel<OutElem, OutErr | E, OutDone, InElem, InErr, InDone, Env | R>
} = dual(2, <OutElem, OutErr, OutDone, InElem, InErr, InDone, Env, A, E, R>(
  self: Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>,
  onFirst: (element: Types.NoInfer<OutElem>) => Effect.Effect<A, E, R>
): Channel<OutElem, OutErr | E, OutDone, InElem, InErr, InDone, Env | R> =>
  transformPull(self, (pull) =>
    Effect.sync(() => {
      let isFirst = true
      const pullFirst = Effect.tap(pull, (element) => {
        isFirst = false
        return onFirst(element)
      })
      return Effect.suspend(() => isFirst ? pullFirst : pull)
    })))
Referenced by 2 symbols