# `MingaEditor.RenderModel.Window.LazyRowTree`
[🔗](https://github.com/jsmestad/minga/blob/main/lib/minga_editor/render_model/window/lazy_row_tree.ex#L1)

Persistent ordered row tree with lazy suffix shifts.

This module owns the treap node representation and structural operations. Callers supply calculations for their domain summary and for shifting that summary with a row suffix. The shift calculation must distribute over summary recomputation: shifting a complete subtree must produce the same summary as shifting every key in that subtree.

# `shift_summary`

```elixir
@type shift_summary(summary) :: (summary, integer() -&gt; summary)
```

# `summarize`

```elixir
@type summarize(value, summary) :: (non_neg_integer(),
                              value,
                              summary
                              | nil,
                              summary
                              | nil -&gt;
                                summary)
```

# `t`

```elixir
@type t(value, summary) ::
  nil
  | %MingaEditor.RenderModel.Window.LazyRowTree{
      count: pos_integer(),
      key: non_neg_integer(),
      lazy: integer(),
      left: t(value, summary),
      priority: non_neg_integer(),
      right: t(value, summary),
      summary: summary,
      value: value
    }
```

# `insert`

```elixir
@spec insert(
  t(value, summary),
  t(value, summary),
  summarize(value, summary),
  shift_summary(summary)
) ::
  t(value, summary)
```

# `leaf`

```elixir
@spec leaf(non_neg_integer(), value, non_neg_integer(), summarize(value, summary)) ::
  t(value, summary)
when value: var
```

# `make`

```elixir
@spec make(
  non_neg_integer(),
  value,
  non_neg_integer(),
  t(value, summary),
  t(value, summary),
  summarize(value, summary)
) :: t(value, summary)
when value: var
```

# `merge`

```elixir
@spec merge(
  t(value, summary),
  t(value, summary),
  summarize(value, summary),
  shift_summary(summary)
) ::
  t(value, summary)
```

# `push`

```elixir
@spec push(t(value, summary), shift_summary(summary)) :: t(value, summary)
```

# `shift`

```elixir
@spec shift(t(value, summary), integer(), shift_summary(summary)) :: t(value, summary)
```

# `split`

```elixir
@spec split(
  t(value, summary),
  non_neg_integer(),
  summarize(value, summary),
  shift_summary(summary)
) ::
  {t(value, summary), t(value, summary)}
```

# `summary`

```elixir
@spec summary(t(term(), summary)) :: summary | nil when summary: var
```

# `update`

```elixir
@spec update(
  t(value, summary),
  non_neg_integer(),
  (value -&gt; {:replace, value} | :delete),
  summarize(value, summary),
  shift_summary(summary)
) :: t(value, summary)
when value: var
```

# `view`

```elixir
@spec view(t(value, summary), shift_summary(summary)) ::
  MingaEditor.RenderModel.Window.LazyRowTree.View.t(value, summary) | nil
```

---

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