Map.invert is at least largely harmless, unlike some of the other proposals 
that happen. It's still a little odd to me to have a function that boils 
down to just:

Map.new(map, fn {k, v} -> {v, k} end)

Honestly that is almost clearer if you've never heard the word "invert" 
with respect to maps.

On Wednesday, February 6, 2019 at 1:35:49 AM UTC-5, Justin Gamble 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/745bf765-c4b8-494e-9ded-7d1a50c05c5e%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to