I like it. It would be to `Access.filter` what `Enum.find` is to
`Enum.filter`.
I think it would be a nice addition as it can express operations that would
be quite verbose otherwise.

Le mer. 20 mars 2024 à 02:30, 'oliver....@googlemail.com' via
elixir-lang-core <elixir-lang-core@googlegroups.com> a écrit :

> 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
> <https://groups.google.com/d/msgid/elixir-lang-core/44ed5beb-1730-46d7-931a-217825cc4432n%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
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/CANnyoha%2BwMRpTy_H2%3Dwy8sWjSQgXPpY-cbaL65Tx7D_AK7o1GA%40mail.gmail.com.

Reply via email to