# `MingaEditor.Effect.Outcome`
[🔗](https://github.com/jsmestad/minga/blob/main/lib/minga_editor/effect/outcome.ex#L1)

Lifecycle or terminal outcome for an admitted slow effect.

`queued` and `running` are lifecycle feedback. `canceled`, `failed`, `stale`,
and `completed` are terminal. Domain handlers may reclassify a completed
worker result as stale while atomically applying it to current editor state.

# `lifecycle_status`

```elixir
@type lifecycle_status() :: :queued | :running
```

# `status`

```elixir
@type status() :: lifecycle_status() | terminal_status()
```

# `t`

```elixir
@type t() :: %MingaEditor.Effect.Outcome{
  queue_position: pos_integer() | nil,
  queue_total: pos_integer() | nil,
  reason: term() | nil,
  request: MingaEditor.Effect.Request.t(),
  result: term() | nil,
  status: status()
}
```

# `terminal_status`

```elixir
@type terminal_status() :: :canceled | :failed | :stale | :completed
```

# `canceled`

```elixir
@spec canceled(MingaEditor.Effect.Request.t(), term()) :: t()
```

Builds a canceled terminal candidate.

# `completed`

```elixir
@spec completed(MingaEditor.Effect.Request.t(), term()) :: t()
```

Builds a completed terminal candidate.

# `failed`

```elixir
@spec failed(MingaEditor.Effect.Request.t(), term()) :: t()
```

Builds a failed terminal candidate.

# `queued`

```elixir
@spec queued(MingaEditor.Effect.Request.t(), pos_integer(), pos_integer()) :: t()
```

Builds a queued lifecycle outcome with scheduler-authored queue metadata.

# `running`

```elixir
@spec running(MingaEditor.Effect.Request.t()) :: t()
```

Builds a running lifecycle outcome.

# `stale`

```elixir
@spec stale(t(), term()) :: t()
```

Reclassifies an outcome as stale after domain-owned application.

# `terminal?`

```elixir
@spec terminal?(t()) :: boolean()
```

Returns whether the outcome is terminal.

---

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