# `Minga.RenderModel.Window.RowDelta`
[🔗](https://github.com/jsmestad/minga/blob/main/lib/minga/render_model/window/row_delta.ex#L1)

A validated row-sequence transition expressed in immutable-base coordinates.

The current renderer can derive one prefix/suffix splice from two snapshots via
`from_snapshots/2`. Ticket #2742 can replace that derivation with ChangeLog-owned
splices without changing the encoder or frontend wire contract.

# `t`

```elixir
@type t() :: %Minga.RenderModel.Window.RowDelta{
  base_row_count: non_neg_integer(),
  result_row_count: non_neg_integer(),
  splices: [Minga.RenderModel.Window.RowSplice.t()]
}
```

# `validation_error`

```elixir
@type validation_error() ::
  :count_out_of_range
  | :empty_splice
  | :splice_out_of_range
  | :splices_not_strictly_ascending
  | :splices_overlap
  | :result_count_mismatch
```

# `from_snapshots`

```elixir
@spec from_snapshots([Minga.RenderModel.Window.Row.t()], [
  Minga.RenderModel.Window.Row.t()
]) :: t()
```

Derives the temporary single prefix/suffix splice used before #2742 supplies ChangeLog deltas.

# `new`

```elixir
@spec new(non_neg_integer(), non_neg_integer(), [
  Minga.RenderModel.Window.RowSplice.t()
]) ::
  {:ok, t()} | {:error, validation_error()}
```

Builds and validates a row delta.

# `validate`

```elixir
@spec validate(t()) :: :ok | {:error, validation_error()}
```

Validates immutable-base ordering, ranges, and exact result arithmetic.

---

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