# `Delegator.AritiesMap`
[🔗](https://codeberg.org/pfac/delegator)

Data structure to record the arities of functions to include/exclude from
delegation.

It uses a regular map, where keys are the function names as strings, and the
values are either `:*` or a set of arities for that function.

All functions treat atoms and strings equally, i.e. function name `:a` is the
same as function name `"a"`.

# `count`

Returns the number of entries in the arities map.

# `fetch`

Fetch the arities for a specific function name.

Returns `{:ok, arities}` if there is an entry for the provided function name,
otherwise returns `:error`.

## Examples

    iex> Delegator.AritiesMap.new(:a)
    ...> |> Delegator.AritiesMap.fetch(:a)
    {:ok, :*}

    iex> Delegator.AritiesMap.new(:a)
    ...> |> Delegator.AritiesMap.fetch("a")
    {:ok, :*}

    iex> Delegator.AritiesMap.new(a: 1, a: 2)
    ...> |> Delegator.AritiesMap.fetch("a")
    {:ok, [1, 2]}

    iex> Delegator.AritiesMap.new()
    ...> |> Delegator.AritiesMap.fetch(:a)
    :error

# `get`

Get the arities for a specific function name.

If there's no entry for the provided function name, returns the default value.

## Examples

    iex> Delegator.AritiesMap.new(:a)
    ...> |> Delegator.AritiesMap.get(:a)
    :*

    iex> Delegator.AritiesMap.new(:a)
    ...> |> Delegator.AritiesMap.get("a")
    :*

    iex> Delegator.AritiesMap.new(a: 1, a: 2)
    ...> |> Delegator.AritiesMap.get("a")
    [1, 2]

    iex> Delegator.AritiesMap.new()
    ...> |> Delegator.AritiesMap.get(:a)
    nil

    iex> Delegator.AritiesMap.new()
    ...> |> Delegator.AritiesMap.get(:a, :not_found)
    :not_found

# `member?`

Checks whether an entry exists for a function name in the arities map.

Membership is tested with the match (===/2) operator.

# `new`

Build a new arities map.

If provided, arities may be a single function name, or an enumerablei. As an
enumerable it may contain function names, or function name-arity pairs, in any
combination.

Names without arity, or arities using the wildcard `:*` will affect all
functions with that name, regardless of the arity. Such an entry supersedes
any other entries with a similar function name.

## Examples

    iex> Delegator.AritiesMap.new()
    #Delegator.AritiesMap<entries: %{}>

    iex> Delegator.AritiesMap.new(:a)
    #Delegator.AritiesMap<entries: %{"a" => :*}>

    iex> Delegator.AritiesMap.new(a: 1, a: 2)
    #Delegator.AritiesMap<entries: %{"a" => [1, 2]}>

    iex> Delegator.AritiesMap.new([:a, b: 1, b: 2])
    #Delegator.AritiesMap<entries: %{"a" => :*, "b" => [1, 2]}>

# `put`

Add function to an arities map.

The provided function arity is add to a set under the function name key.

The wildcard value overwrites any pre-defined set, and can not be overwritten.

## Examples

    iex> Delegator.AritiesMap.put(%Delegator.AritiesMap{}, :a)
    #Delegator.AritiesMap<entries: %{"a" => :*}>

    iex> Delegator.AritiesMap.put(%Delegator.AritiesMap{}, :a, 1)
    #Delegator.AritiesMap<entries: %{"a" => [1]}>

    iex> %Delegator.AritiesMap{}
    ...> |> Delegator.AritiesMap.put(:a, 1)
    ...> |> Delegator.AritiesMap.put(:a)
    ...> |> Delegator.AritiesMap.put(:a, 2)
    #Delegator.AritiesMap<entries: %{"a" => :*}>

# `reduce`

Invokes a function for each entry in the arities map with the accumulator.

The initial value of the accumulator is acc. The function is invoked for each
entry in the enumerable with the accumulator. The result returned by the
function is used as the accumulator for the next iteration. The function
returns the last accumulator.

# `slice`

Returns a function that slices the arities map contiguously.

# `to_list`

Returns a list of pairs with the function name-arities pairs in the entries.

Pairs are ordered by the function name, alphabetically.

## Examples

    iex> Delegator.AritiesMap.new()
    ...> |> Delegator.AritiesMap.to_list()
    []

    iex> Delegator.AritiesMap.new(a: 1, b: :*)
    ...> |> Delegator.AritiesMap.to_list()
    [{"a", [1]}, {"b", :*}]

    iex> Delegator.AritiesMap.new(b: :*, a: 1)
    ...> |> Delegator.AritiesMap.to_list()
    [{"a", [1]}, {"b", :*}]

---

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