README.md

# ParamMap

Use atom keys to access values in string-keyed maps.

Unlike similar packages, `ParamMap`, does not blindly convert strings to atoms.
It converts only the keys you specify.

The API is compatible with a subset of the `Map` module, which we are already
familiar with.

If you use Ecto, maybe you know that as hard as we try, we can't help but
read values from untrusted, string-keyed maps before they get
normalized into an Ecto.Changeset.
Changesets can be too heavy-handed for some situations.

## Usage

```elixir
iex> params = %{"color" => "red", "size" => "large", "age" => 100}

iex> ParamMap.get(params, :color)
"red"

iex> ParamMap.delete(params, :size)
%{"color" => "red", "age" => 100}

iex> ParamMap.take(params, [:color, :size])
%{color: "red", size: "large"}

iex> ParamMap.pop(params, :color)
{"red", %{"size" => "large", "age" => 100}}

## Still works with maps that have atom keys, in case you don't
## know ahead of time whether the keys are strings or atoms.

iex> params = %{:color => "red", "age" => 100}

iex> ParamMap.get(params, :color)
"red"

# The params may have a key both as a string and an atom.
# `get/1`, `pop/1`, and `take/2` prioritize the atom key.
# `delete/2`, `pop/1` remove both the atom and string version of the key.

iex> params = %{:color => "red", "color" => "blue"}

iex> ParamMap.get(params, :color)
"red"

iex> params = %{:color => "red", "color" => "blue", "age" => 100}

iex> ParamMap.delete(params, :color)
%{"age" => 100}

iex> params = %{:color => "red", "color" => "blue", "age" => 100}

iex> ParamMap.pop(params, :color)
{"red", %{"age" => 100}}
```

## Installation

The package can be installed by adding `param_map` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:param_map, "~> 0.1"}
  ]
end
```