Hi Paul, Thanks for the proposal. My personal take is that a Enum.reduce/3 + the relevant Map operation should be the way to go, because this can easily lead to a combination of replace_many, update_many, put_new_many, etc. Especially because the many operations likely wouldn't be any more efficient than the Enum.reduce/3 call.
On Thu, Dec 30, 2021 at 10:42 PM Paul Alexander <paul.aj.mans...@gmail.com> wrote: > Hi everyone, > > I would like to discuss the possibility of adding two new functions to > each of the Map and Keyword modules; replace_many/2 and update_many/3. > Their purpose is to update maps and keyword lists providing either a > keyword list of the key-value pairs which need to updated, or a list of > keys and a function which operates on the existing values of those keys. > > Far too often I find myself needing to call replace!/3 or update!/3 > several times from within a pipeline, or even needing to use a > for-comprehension or Enum.reduce/3 to update a map in "one shot", when it > feels like there should be a function for this. > > There are a number of reasons as to why I think these functions should be > considered, but I'll provide only two for now: > > 1. There is already a way of updating multiple key-value pairs > simultaneously for maps using %{map | k1 => v1, k2 => v2}. But this > unfortunately does not support passing a literal keyword list after the > cons operator. > - My first instinct was to see if I could expand the special update > syntax to handle keyword lists, but I wasn't able to find where it is in > the codebase. If someone could point that out for me because I'd like to > learn how it works, I'd greatly appreciate it. > 2. It would be somewhat analogous to Kernel.struct!/2, where keyword > lists can be passed as the second argument to update several fields within > a struct. Seeing as how structs are maps, it only makes sense there should > be a way that maps could be updated in a similar manner from within the Map > module. > > > I have already implemented the four functions, complete with docs, > examples, and passing tests. But I wanted confirmation from the core team > if a PR is welcome for this addition. Any opinions? > > -- > 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/7c79a2b8-3a3c-48f9-a4d0-7d2e07c851e4n%40googlegroups.com > <https://groups.google.com/d/msgid/elixir-lang-core/7c79a2b8-3a3c-48f9-a4d0-7d2e07c851e4n%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/CAGnRm4%2BnxBvFjbfR4rypSaNaqS2a70ojFjT_DL4AVjouynBX_A%40mail.gmail.com.