# `Reactor.Executor.StepRunner`
[🔗](https://github.com/ash-project/reactor/blob/main/lib/reactor/executor/step_runner.ex/#L6)

Run an individual step, including compensation if possible.

# `run`

```elixir
@spec run(
  Reactor.t(),
  Reactor.Executor.State.t(),
  Reactor.Step.t(),
  Reactor.Executor.ConcurrencyTracker.pool_key()
) ::
  Reactor.Step.run_result()
  | {:skip, Reactor.Step.run_result()}
  | {:backoff, pos_integer(), Reactor.Step.run_result()}
```

Collect the arguments and and run a step, with compensation if required.

# `run_async`

```elixir
@spec run_async(
  Reactor.t(),
  Reactor.Executor.State.t(),
  Reactor.Step.t(),
  Reactor.Executor.ConcurrencyTracker.pool_key(),
  map()
) ::
  Reactor.Step.run_result()
  | {:skip, Reactor.Step.run_result()}
  | {:backoff, pos_integer(), Reactor.Step.run_result()}
```

Run a step inside a task.

This is a simple wrapper around `run/4` except that it emits more events.

# `undo`

```elixir
@spec undo(
  Reactor.t(),
  Reactor.Executor.State.t(),
  Reactor.Step.t(),
  any(),
  Reactor.Executor.ConcurrencyTracker.pool_key()
) :: :ok | {:error, any()}
```

Undo a step if possible.

---

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