MingaEditor.RenderModel.Window.LazyRowTree (Minga v0.1.0)

Copy Markdown View Source

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.

Summary

Types

shift_summary(summary)

@type shift_summary(summary) :: (summary, integer() -> summary)

summarize(value, summary)

@type summarize(value, summary) :: (non_neg_integer(),
                              value,
                              summary
                              | nil,
                              summary
                              | nil ->
                                summary)

t(value, summary)

@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
    }

Functions

insert(root, node, summarize, shift_summary)

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

leaf(key, value, priority, summarize)

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

make(key, value, priority, left, right, summarize)

@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(left, right, summarize, shift_summary)

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

push(tree, shift_summary)

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

shift(tree, delta, shift_summary)

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

split(root, key, summarize, shift_summary)

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

summary(arg1)

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

update(root, key, fun, summarize, shift_summary)

@spec update(
  t(value, summary),
  non_neg_integer(),
  (value -> {:replace, value} | :delete),
  summarize(value, summary),
  shift_summary(summary)
) :: t(value, summary)
when value: var

view(tree, shift_summary)

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