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.