# PieceTable
The PieceTable module provides a naive implementation of the piece-table data structure
for efficient text editing operations.
A piece-table represents an editable buffer of text as a sequence of non-overlapping
pieces, allowing efficient inserts, deletes, and modifications.
This structure allows virtually infinite undo/redo, as long as we can keep the complete
list of changes.
If a change is attempted when there unapplied changes (result of applying `PieceTable.redo` or `PieceTable.redo!`)
it will return an error.
## Usage
```elixir
iex> table = PieceTable.new!("Hello, world!")
%PieceTable{
original: "Hello, world!",
result: "Hello, world!",
edited: [keep: 13],
index: 0
}
iex> table = PieceTable.insert!(table, "you ", 7)
%PieceTable{
original: "Hello, world!",
result: "Hello, you world!",
edited: [{:add, "you ", 7}, {:keep, 13}],
index: 0
}
iex> table = PieceTable.delete!(table, 10, 6)
%PieceTable{
original: "Hello, world!",
result: "Hello, you!",
edited: [{:remove, " world", 10}, {:add, "you ", 7}, {:keep, 13}],
index: 0
}
iex> table = PieceTable.undo!(table)
%PieceTable{
original: "Hello, world!",
result: "Hello, you world!",
edited: [{:remove, " world", 10}, {:add, "you ", 7}, {:keep, 13}],
index: 1
}
iex> table = PieceTable.redo!(table)
%PieceTable{
original: "Hello, world!",
result: "Hello, you!",
edited: [{:remove, " world", 10}, {:add, "you ", 7}, {:keep, 13}],
index: 0
}
iex> PieceTable.get_text(table)
"Hello, you!"
```
## Installation
If [available in Hex](https://hex.pm/docs/publish), the package can be installed
by adding `piece_table` to your list of dependencies in `mix.exs`:
```elixir
def deps do
[
{:piece_table, "~> 0.1.0"}
]
end
```
Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc)
and published on [HexDocs](https://hexdocs.pm). Once published, the docs can
be found at <https://hexdocs.pm/piece_table>.