# `Orchid.Scheduler`
[🔗](https://github.com/SynapticStrings/Orchid/blob/main/lib/orchid/scheduler.ex#L1)

Scheduler is responsible for managing and scheduling the execution order of steps in the Recipe.

# `initial_params`
[🔗](https://github.com/SynapticStrings/Orchid/blob/main/lib/orchid/scheduler.ex#L71)

```elixir
@type initial_params() :: [Orchid.Param.t()] | Orchid.Scheduler.Context.param_map()
```

Initial parameters can be a list of Params or a map of Params.

# `build`
[🔗](https://github.com/SynapticStrings/Orchid/blob/main/lib/orchid/scheduler.ex#L77)

```elixir
@spec build(
  Orchid.Recipe.t() | [Orchid.Step.t()],
  initial_params(),
  Orchid.WorkflowCtx.t()
) ::
  {:ok, Orchid.Scheduler.Context.t()} | {:error, term()}
```

Initialize scheduler context.

# `done?`
[🔗](https://github.com/SynapticStrings/Orchid/blob/main/lib/orchid/scheduler.ex#L205)

```elixir
@spec done?(Orchid.Scheduler.Context.t()) :: boolean()
```

# `get_results`
[🔗](https://github.com/SynapticStrings/Orchid/blob/main/lib/orchid/scheduler.ex#L209)

```elixir
@spec get_results(Orchid.Scheduler.Context.t()) ::
  Orchid.Scheduler.Context.param_map()
```

# `get_results`
[🔗](https://github.com/SynapticStrings/Orchid/blob/main/lib/orchid/scheduler.ex#L210)

# `inject_opts`
[🔗](https://github.com/SynapticStrings/Orchid/blob/main/lib/orchid/scheduler.ex#L193)

```elixir
@spec inject_opts(
  Orchid.Scheduler.Context.t(),
  (Orchid.Step.t() -&gt; boolean()),
  keyword()
) ::
  Orchid.Scheduler.Context.t()
```

Batch update configuration (at runtime).

This is used in scenarios where after an external service crashes and re-assigned,
but several steps' options still use the old references.

# `mark_running_steps`
[🔗](https://github.com/SynapticStrings/Orchid/blob/main/lib/orchid/scheduler.ex#L140)

```elixir
@spec mark_running_steps(
  Orchid.Scheduler.Context.t(),
  Orchid.Scheduler.Context.step_index()
  | [Orchid.Scheduler.Context.step_index()],
  mode :: :running | :reattempt
) :: Orchid.Scheduler.Context.t()
```

Mark those steps that have started running(or remove when failed).

# `merge_result`
[🔗](https://github.com/SynapticStrings/Orchid/blob/main/lib/orchid/scheduler.ex#L157)

```elixir
@spec merge_result(
  Orchid.Scheduler.Context.t(),
  non_neg_integer(),
  [Orchid.Param.t()] | Orchid.Param.t()
) :: Orchid.Scheduler.Context.t()
```

After the Step is executed, merge the result back into the Context.

# `next_ready_steps`
[🔗](https://github.com/SynapticStrings/Orchid/blob/main/lib/orchid/scheduler.ex#L120)

```elixir
@spec next_ready_steps(Orchid.Scheduler.Context.t()) :: [
  {Orchid.Step.t(), Orchid.Scheduler.Context.step_index()}
]
```

Core scheduling function: Identify all the steps that are "inputs params ready" and "not executed".

---

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