Hi.

I already made a PR but was redirected here. ;-)

This new function Access.find/1 would basically work like Enum.find/2 but 
for get_in/2 and similar functions.

It can be used for scenarios like:
- Popping the first found element.
- Updating only the first found match in a list.
- To get_in/2 an element directly instead of piping from get_in/2 into 
Enum.find/2.

The implementation is very similar to Access.filter/1 and Access.at/1.

We added this functions as utility function in our own project because we 
couldn't really find an elegant way to do such pointed updates with the 
existing functions.

These are the examples I would have included in the doc string:

      iex> list = [%{name: "john", salary: 10}, %{name: "francine", salary: 
30}]
      iex> get_in(list, [Access.find(&(&1.salary > 20)), :name])
      "francine"

      iex>  get_and_update_in(list, [Access.find(&(&1.salary <= 40)), 
:name], fn prev ->
      ...> {prev, String.upcase(prev)}
      ...>  end)
      {"john", [%{name: "JOHN", salary: 10}, %{name: "francine", salary: 
30}]}

      iex> list = [%{name: "john", salary: 10}, %{name: "francine", salary: 
30}]
      iex> pop_in(list, [Access.find(&(&1.salary <= 40))])
      {%{name: "john", salary: 10}, [%{name: "francine", salary: 30}]}

      iex> list = [%{name: "john", salary: 10}, %{name: "francine", salary: 
30}]
      iex> get_in(list, [Access.find(&(&1.salary >= 50)), :name])
      nil

      iex> get_and_update_in(list, [Access.find(&(&1.salary >= 50)), 
:name], fn prev ->
      ...>   {prev, String.upcase(prev)}
      ...> end)
      {nil, [%{name: "john", salary: 10}, %{name: "francine", salary: 30}]}

Thanks,
Oliver

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elixir-lang-core+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/44ed5beb-1730-46d7-931a-217825cc4432n%40googlegroups.com.

Reply via email to