Hyperlinkv0.8.0-beta.28

Channel

Channel.retryconsteffect/Channel.ts:5718
<SO, OutErr, SE, SR>(
  schedule:
    | Schedule.Schedule<SO, Types.NoInfer<OutErr>, SE, SR>
    | ((
        $: <SO, SE, SR>(
          _: Schedule.Schedule<SO, Types.NoInfer<OutErr>, SE, SR>
        ) => Schedule.Schedule<SO, OutErr, SE, SR>
      ) => Schedule.Schedule<SO, Types.NoInfer<OutErr>, SE, SR>)
): <OutElem, OutDone, InElem, InErr, InDone, Env>(
  self: Channel<
    OutElem,
    OutErr | SE,
    OutDone,
    InElem,
    InErr,
    InDone,
    Env | SR
  >
) => Channel<
  OutElem,
  OutErr | SE,
  OutDone,
  InElem,
  InErr,
  InDone,
  Env | SR
>
<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env, SO, SE, SR>(
  self: Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>,
  schedule:
    | Schedule.Schedule<SO, OutErr, SE, SR>
    | ((
        $: <SO, SE, SR>(
          _: Schedule.Schedule<SO, Types.NoInfer<OutErr>, SE, SR>
        ) => Schedule.Schedule<SO, OutErr, SE, SR>
      ) => Schedule.Schedule<SO, Types.NoInfer<OutErr>, SE, SR>)
): Channel<OutElem, OutErr | SE, OutDone, InElem, InErr, InDone, Env | SR>

Returns a new channel that retries this channel according to the specified schedule whenever it fails.

error handling
Source effect/Channel.ts:571863 lines
export const retry: {
  <SO, OutErr, SE, SR>(
    schedule:
      | Schedule.Schedule<SO, Types.NoInfer<OutErr>, SE, SR>
      | ((
        $: <SO, SE, SR>(
          _: Schedule.Schedule<SO, Types.NoInfer<OutErr>, SE, SR>
        ) => Schedule.Schedule<SO, OutErr, SE, SR>
      ) => Schedule.Schedule<SO, Types.NoInfer<OutErr>, SE, SR>)
  ): <OutElem, OutDone, InElem, InErr, InDone, Env>(
    self: Channel<OutElem, OutErr | SE, OutDone, InElem, InErr, InDone, Env | SR>
  ) => Channel<OutElem, OutErr | SE, OutDone, InElem, InErr, InDone, Env | SR>
  <OutElem, OutErr, OutDone, InElem, InErr, InDone, Env, SO, SE, SR>(
    self: Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>,
    schedule:
      | Schedule.Schedule<SO, OutErr, SE, SR>
      | ((
        $: <SO, SE, SR>(
          _: Schedule.Schedule<SO, Types.NoInfer<OutErr>, SE, SR>
        ) => Schedule.Schedule<SO, OutErr, SE, SR>
      ) => Schedule.Schedule<SO, Types.NoInfer<OutErr>, SE, SR>)
  ): Channel<OutElem, OutErr | SE, OutDone, InElem, InErr, InDone, Env | SR>
} = dual(2, <OutElem, OutErr, OutDone, InElem, InErr, InDone, Env, SO, SE, SR>(
  self: Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>,
  schedule:
    | Schedule.Schedule<SO, OutErr, SE, SR>
    | ((
      $: <O, SE, R>(_: Schedule.Schedule<O, Types.NoInfer<OutErr>, SE, R>) => Schedule.Schedule<O, OutErr, SE, R>
    ) => Schedule.Schedule<SO, Types.NoInfer<OutErr>, SE, SR>)
): Channel<OutElem, OutErr | SE, OutDone, InElem, InErr, InDone, Env | SR> =>
  suspend(() => {
    let step: ((input: OutErr) => Pull.Pull<Schedule.Metadata<SO, OutErr>, SE, SO, SR>) | undefined = undefined
    let meta = Schedule.CurrentMetadata.defaultValue()
    const selfWithMeta = provideServiceEffect(self, Schedule.CurrentMetadata, Effect.sync(() => meta))
    const withReset = onFirst(selfWithMeta, () => {
      step = undefined
      return Effect.void
    })
    const resolvedSchedule = typeof schedule === "function" ? schedule(identity_) : schedule
    const loop: Channel<
      OutElem,
      OutErr | SE,
      OutDone,
      InElem,
      InErr,
      InDone,
      Env | SR
    > = catch_(
      withReset,
      Effect.fnUntraced(
        function*(error) {
          if (!step) {
            step = yield* Schedule.toStepWithMetadata(resolvedSchedule)
          }
          meta = yield* step(error)
          return loop
        },
        (effect, error) => Pull.catchDone(effect, () => Effect.succeed(fail(error))),
        unwrap
      )
    )
    return loop
  }))
Referenced by 1 symbols