# `Minga.Buffer.ChangeLog`
[🔗](https://github.com/jsmestad/minga/blob/main/lib/minga/buffer/change_log.ex#L1)

Ordered record of edit deltas that lets sync consumers catch up independently.

The buffer process applies edits to the document immediately. This struct remembers the resulting `Minga.Buffer.EditDelta` values for systems that sync incrementally, such as highlighting or language tooling. Each consumer keeps its own cursor, so one consumer reading changes does not steal them from another consumer.

This module is pure state. It does not broadcast events, adjust decorations, or know about GenServer calls.

# `consumer`

```elixir
@type consumer() :: atom()
```

# `entry`

```elixir
@type entry() :: {sequence(), Minga.Buffer.EditDelta.t()}
```

# `sequence`

```elixir
@type sequence() :: non_neg_integer()
```

# `t`

```elixir
@opaque t()
```

# `unseen_changes`

```elixir
@type unseen_changes() :: {:ok, [Minga.Buffer.EditDelta.t()]} | :reset_required
```

# `clear`

```elixir
@spec clear(t()) :: t()
```

Clears all recorded changes and consumer cursors.

# `drain_pending_changes`

```elixir
@spec drain_pending_changes(t()) :: {[Minga.Buffer.EditDelta.t()], t()}
```

Returns globally pending changes in edit order and clears that legacy pending list.

# `new`

```elixir
@spec new() :: t()
```

Creates an empty change log.

# `record_change`

```elixir
@spec record_change(t(), Minga.Buffer.EditDelta.t()) :: t()
```

Records a new edit delta.

# `take_unseen_changes`

```elixir
@spec take_unseen_changes(t(), consumer()) :: {unseen_changes(), t()}
```

Returns changes unseen by `consumer` in edit order and advances that consumer's cursor.

Returns `:reset_required` when older retained entries were compacted before the consumer caught up. Callers must full-sync their downstream state in that case.

---

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