EnhancedAccess (enhanced_access v0.1.0)
Documentation for EnhancedAccess
.
Link to this section Summary
Functions
Be able to access any key in a Map or a Keyword list through the Access protocol
Allow for optional keys in the Access protocol
Be able to access any key except some key you want to skip in a Map or a Keyword list through the Access protocol
Link to this section Functions
Link to this function
all_keys()
Specs
all_keys() :: Access.access_fun(data :: Access.container(), current_value :: term())
Be able to access any key in a Map or a Keyword list through the Access protocol
Examples
iex> get_in(%{a: %{b: 1}, c: %{b: 2}}, [EnhancedAccess.all_keys(), :b])
[1, 2]
iex> get_in(%{a: %{b: 1}, c: %{b: 2}}, [EnhancedAccess.all_keys()])
[%{b: 1}, %{b: 2}]
iex> get_in([a: %{b: 1}, c: %{b: 2}], [EnhancedAccess.all_keys()])
[%{b: 1}, %{b: 2}]
iex> deeper_nesting = %{a: %{b: %{c: 1}}, d: %{b: %{c: 2}}, e: %{b: 1}}
iex> get_in(deeper_nesting, [EnhancedAccess.all_keys(), :b, EnhancedAccess.optional_key(:c)])
[1, 2, nil]
iex> update_in(%{a: %{b: 1}, c: %{b: 2}}, [EnhancedAccess.all_keys(), :b], &(&1 + 1))
%{a: %{b: 2}, c: %{b: 3}}
iex> update_in([a: %{b: 1}, c: %{b: 2}], [EnhancedAccess.all_keys(), :b], &(&1 + 1))
[a: %{b: 2}, c: %{b: 3}]
iex> update_in([a: [b: 1], c: [b: 2]], [EnhancedAccess.all_keys(), :b], &(&1 + 1))
[a: [b: 2], c: [b: 3]]
iex> get_and_update_in(%{a: %{b: 1}, c: %{b: 2}}, [EnhancedAccess.all_keys(), :b], &{&1, &1 + 1})
{[1, 2], %{a: %{b: 2}, c: %{b: 3}}}
iex> pop_in(%{a: %{b: 1}, c: %{b: 2}}, [EnhancedAccess.all_keys(), :b])
{[1, 2], %{a: %{}, c: %{}}}
Link to this function
optional_key(key)
Specs
optional_key(term()) :: Access.access_fun(data :: Access.container(), current_value :: term())
Allow for optional keys in the Access protocol
Examples
iex> get_in(%{a: %{b: 1}, c: 1}, [EnhancedAccess.all_keys(), EnhancedAccess.optional_key(:b)])
[1, nil]
iex> get_in(%{a: 1, c: %{b: 1}}, [EnhancedAccess.all_keys(), EnhancedAccess.optional_key(:b)])
[nil, 1]
iex> deeper_nesting = %{a: %{b: %{c: 1}}, d: %{b: %{c: 2}}, e: %{d: 1}}
iex> get_in(deeper_nesting, [EnhancedAccess.all_keys(), EnhancedAccess.optional_key(:b), :c])
[1, 2, nil]
iex> update_in(%{a: %{b: 1}, c: %{d: 2}}, [EnhancedAccess.all_keys(), EnhancedAccess.optional_key(:b)], &(&1 + 1))
%{a: %{b: 2}, c: %{d: 2}}
iex> update_in([a: [b: 1], c: [d: 2]], [EnhancedAccess.all_keys(), EnhancedAccess.optional_key(:b)], &(&1 + 1))
[a: [b: 2], c: [d: 2]]
iex> get_and_update_in(%{a: %{b: 1}, c: %{d: 2}}, [EnhancedAccess.all_keys(), EnhancedAccess.optional_key(:b)], &{&1, &1 + 1})
{[1, nil], %{a: %{b: 2}, c: %{d: 2}}}
iex> pop_in(%{a: %{b: 1}, c: %{d: 2}}, [EnhancedAccess.all_keys(), EnhancedAccess.optional_key(:b)])
{[1, nil], %{a: %{}, c: %{d: 2}}}
Link to this function
skip_keys(keys)
Specs
skip_keys(keys :: list()) :: Access.access_fun(data :: Access.container(), current_value :: term())
Be able to access any key except some key you want to skip in a Map or a Keyword list through the Access protocol
Examples
iex> get_in(%{a: %{b: 1}, c: %{b: 2}, d: %{b: 3}}, [EnhancedAccess.skip_keys([:d]), :b])
[1, 2]
iex> get_in(%{a: %{b: 1}, c: %{b: 2}, d: %{b: 3}}, [EnhancedAccess.skip_keys([:d])])
[%{b: 1}, %{b: 2}]
iex> get_in([a: %{b: 1}, c: %{b: 2}, d: %{b: 3}], [EnhancedAccess.skip_keys([:d])])
[%{b: 1}, %{b: 2}]
iex> deeper_nesting = %{a: %{b: %{c: 1}}, d: %{b: %{c: 2}}}
iex> get_in(deeper_nesting, [EnhancedAccess.skip_keys([:d]), :b, :c])
[1]
iex> update_in(%{a: %{b: 1}, c: %{b: 2}, d: %{b: 3}}, [EnhancedAccess.skip_keys([:d]), :b], &(&1 + 1))
%{a: %{b: 2}, c: %{b: 3}, d: %{b: 3}}
iex> update_in([a: %{b: 1}, c: %{b: 2}, d: %{b: 3}], [EnhancedAccess.skip_keys([:d]), :b], &(&1 + 1))
[a: %{b: 2}, c: %{b: 3}, d: %{b: 3}]
iex> update_in([a: [b: 1], c: [b: 2], d: [b: 3]], [EnhancedAccess.skip_keys([:d]), :b], &(&1 + 1))
[a: [b: 2], c: [b: 3], d: [b: 3]]
iex> get_and_update_in(%{a: %{b: 1}, c: %{b: 2}, d: %{b: 3}}, [EnhancedAccess.skip_keys([:d]), :b], &{&1, &1 + 1})
{[1, 2], %{a: %{b: 2}, c: %{b: 3}, d: %{b: 3}}}
iex> pop_in(%{a: %{b: 1}, c: %{b: 2}, d: %{b: 3}}, [EnhancedAccess.skip_keys([:d]), :b])
{[1, 2], %{a: %{}, c: %{}, d: %{b: 3}}}