Re: [elixir-core:8467] [Proposal] Add invert() method to Map module

2019-02-06 Thread Amos King - Binary Noggin
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  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
>  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
> 
> .
> 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 

[elixir-core:8467] [Proposal] Add invert() method to Map module

2019-02-05 Thread Justin Gamble
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 
 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.
For more options, visit https://groups.google.com/d/optout.