README.md

# MapsAsFunctions

A compile-time macro to build fast mapper and predicate functions from a map.

## Usage

Define a map in your module using the macro `MapsAsFunctions.defmap/2`:

```elixir
use MapsAsFunctions

defmap :bar, [
  a: 1,
  b: 2
]
```

`MapsAsFunctions.defmap/2` will define, given a map `:bar`, a module-attribute `@bar`, which you can use as normal in further function definitions:

```elixir
def bar_values do
  Map.values(@bar)
end
```

`MapsAsFunctions.defmap/2` will also define, given a map `:bar`, the public functions `bar/0`, `bar/1`, and `bar?/1`:

```elixir
iex> Foo.bar
%{a: 1, b: 2}

iex> Foo.bar(:a)
1

iex> Foo.bar(:c)
nil

iex> Foo.bar?(:a)
true

iex> Foo.bar?(:c)
false
```

There will also be a strict version of `bar/1`, called `bar!/1`:

```elixir
iex> Foo.bar!(:a)
1

iex> Foo.bar!(:c)
** (FunctionClauseError) no function clause matching in Foo.bar!/1
```

...and a function `bar_keys/0` that returns the keys of the map as a `MapSet`:

```elixir
iex> Foo.bar_keys
#MapSet<[:a, :b]>
```

None of the above functions have any runtime logic; they are all expanded into a series of function-clauses at compile time.

## Installation

Add `maps_as_functions` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:maps_as_functions, "~> 0.1.0"}
  ]
end
```

Docs can be found at [https://hexdocs.pm/maps_as_functions](https://hexdocs.pm/maps_as_functions).