# `Foundation.Retry.Runner`
[🔗](https://github.com/nshkrdotcom/foundation/blob/v0.2.1/lib/foundation/retry/runner.ex#L1)

Generic retry runner backed by `Foundation.Retry.Handler`.

# `telemetry_events`
[🔗](https://github.com/nshkrdotcom/foundation/blob/v0.2.1/lib/foundation/retry/runner.ex#L8)

```elixir
@type telemetry_events() :: %{
  optional(:start) =&gt; [atom()],
  optional(:stop) =&gt; [atom()],
  optional(:retry) =&gt; [atom()],
  optional(:failed) =&gt; [atom()]
}
```

# `run`
[🔗](https://github.com/nshkrdotcom/foundation/blob/v0.2.1/lib/foundation/retry/runner.ex#L34)

```elixir
@spec run(
  (-&gt; result),
  keyword()
) :: {:ok, term()} | {:error, term()}
when result: term()
```

Execute `fun` with retry semantics.

Options:
  * `:handler` - `Foundation.Retry.Handler` to use
  * `:config` - config struct implementing `to_handler_opts/1`
  * `:handler_opts` - keyword options for `Handler.new/1`
  * `:sleep_fun` - sleep function (default: `&Process.sleep/1`)
  * `:before_attempt` - function invoked with the attempt number
  * `:retry_on` - function determining retry eligibility
  * `:delay_fun` - function to compute delay (arity 2: result, handler)
  * `:max_elapsed_ms` - maximum elapsed time before halting retries
  * `:time_fun` - time function (default: `&System.monotonic_time/1`)
  * `:rescue_exceptions` - whether to rescue exceptions (default: true)
  * `:telemetry_events` - map of telemetry event names
  * `:telemetry_metadata` - metadata merged into telemetry events

---

*Consult [api-reference.md](api-reference.md) for complete listing*
