I find that small piece of code would often have other data processing connected to it. I'd hate to cycle through the map multiple times if I was going to swap the key and value, and then do more processing on the value. I think such a function would encourage the practice of chaining along without thinking of the consequences of performance. I personally don't find this to be useful as part of the core of the language, but maybe in a package that you reuse in many of your own projects. If you find that it is pulled into all of your projects it could then be open-sourced so that others could take advantage of it.
Amos King CEO Binary Noggin http://binarynoggin.com #business https://elixiroutlaws.com #elixir podcast http://thisagilelife.com #podcast ======================================================= I welcome VSRE emails. Learn more at http://vsre.info/ ======================================================= On Wed, Feb 6, 2019 at 12:35 AM Justin Gamble <justins...@gmail.com> wrote: > Hi, > > I think an invert() method on Map would be convenient to use. It is only > a handful of lines of code to add to a custom program, but why should users > need to do that? In my opinion this basic functionality should be > implemented by the Map module. > > The invert() method would operate the same way it does for Ruby: > https://ruby-doc.org/core-2.2.2/Hash.html#method-i-invert > > Recently I wanted to invert a map in one of my Elixir programs (details > below), and I googled and found the below solution by Chris McCord in h > ttps://stackoverflow.com/questions/26614682/how-to-change-all-the-values-in-an-elixir-map > : > > def invert(map) when is_map(map) do > for {k, v} <- map, into: %{}, do: {v, k} > end > > I would basically like the above function to be added to the Elixir.Map > module. > > Here is the scenario for which I wanted to use this the invert function: > > *My Elixir program is synchronizing Robot Framework source code files with > TestRail. Robot Framework defines automated test cases. TestRail is a > web-based Test Case Management system. The goal is to synchronize > TestRail to contain all the tests that are defined in the Robot Framework > files, and in the same directory structure.* > > *Originally the Elixir program was specified to only create test cases in > TestRail. When you are creating a test case, the TestRail API > <http://docs.gurock.com/testrail-api2/reference-cases#add_case> requires > you to specify the ID of the directory (aka "section") where the case is > written. For this I use an Elixir Map to map paths to section IDs. When I > want to create a file in directory "/path/to/test.robot", then I Lookup the > section ID from my map & then call the "add_case" TestRail API function.* > > *That version of the program was a success. My boss was impressed and > next asked for enhancements to the program. The new functionality being > requested is to have existing TestRail Test Cases get updated with the > latest test steps defined in Robot Framework. Part of that update is to > verify that the path to the test case is the same in the Robot Framework > source code and in the TestRail. In this case we first call the TestRail > API to lookup a test case, at which point we know the section ID that it > belongs to. But we need to translate that to a directory path and confirm > that this path is the same location as where the test file exists in the > Robot Framework source code. * > > *For updating, it makes sense to also be able to use an Elixir Map to map > from the Section ID back to the Path -- the inverse of the original map. * > > *It is true that I could iterate through the original map until I found > the section ID in the value section, and then return the map index. But > that seems awfully inefficient when you consider that there are hundreds of > test files and thousands of tests. So I decided an inverse map would > provide faster lookup, at the cost of more memory being used. Also note > that in my scenario both the indexes and the values are unique; it is a > 1-to-1 mapping.* > > > This is just one example scenario. I imagine other examples exist, or > else the invert() function would never have been created in the Ruby > community. > > -- > 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/b2c7e58a-ad99-4458-a45e-9f7d5f7fce15%40googlegroups.com > <https://groups.google.com/d/msgid/elixir-lang-core/b2c7e58a-ad99-4458-a45e-9f7d5f7fce15%40googlegroups.com?utm_medium=email&utm_source=footer> > . > For more options, visit https://groups.google.com/d/optout. > -- 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/CAJr6D4T05yO6NOL9QzB757KsOAALYd_ZF8gzcWW%2BYB51LmuBOQ%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.