README.md

# Alltid

Alltid offers a simplified approach to editing deeply nested immutable data structures in Elixir.

Inspired by [Immer.js](https://immerjs.github.io/immer/) in JavaScript, Alltid allows a natural
declarative syntax for manipulating deeply nested immutible data structures.

```
require Alltid

data = %{accounts: [%{id: 1, balance: 200}, %{id: 2, balance: 150}]}

next = Alltid.produce(data, fn draft ->
  draft[:accounts][0][:balance] <- draft[:accounts][0][:balance] + 50
  draft[:accounts][1][:balance] <- draft[:accounts][1][:balance] - 50
end)
```

This example is simply syntactic sugar for the following:

```
data = %{accounts: [%{id: 1, balance: 200}, %{id: 2, balance: 150}]}

data
|> put_in([:accounts, Access.at(0), :balance], get_in([:accounts, Access.at(0), :balance]) + 50)
|> put_in([:accounts, Access.at(1), :balance], get_in([:accounts, Access.at(1), :balance]) - 50)
```

Though Alltid's `produce` pattern may appear to violate the spirit of functional programming, it
simply uses Elixir's macro system and variable bindings to enable a more natural and familiar
syntax, entirely isolated to the function passed in to `Alltid.produce`.  The code is still
entirely functional.

## Installation

If [available in Hex](https://hex.pm/docs/publish), the package can be installed
by adding `alltid` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:alltid, "~> 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/alltid>.