> TIL: I knew about Enum.into but not Map.new.
Same here! :) 

Thank you Jose, this suggestion solves the use cases I had in a very simple 
and natural way! I agree there is no need to add a new function.

Le samedi 25 juillet 2020 16:34:42 UTC+9, Zach Daniel a écrit :
>
> TIL: I knew about Enum.into but not Map.new.
>
> On Sat, Jul 25, 2020 at 3:08 AM José Valim <jose...@dashbit.co 
> <javascript:>> wrote:
>
>> Hi Sabiwara,
>>
>> This is very close to Map.new/2 (and Enum.into/3):
>>
>> User |> Repo.all() |> Map.new(fn user -> {user.id, user} end)
>>
>> So my suggestion is to use Map.new/2 instead of adding a new function. :)
>>
>> Thanks for the proposal!
>>
>> On Sat, Jul 25, 2020 at 5:15 AM Sabiwara Yukichi <sabi...@gmail.com 
>> <javascript:>> wrote:
>>
>>> Thank you, I'm glad to see I'm not the only one finding myself needing 
>>> this :)
>>>
>>> > I think that we should keep the first value found for each key
>>> I really wasn't sure about which one would be more consistent with other 
>>> Elixir APIs, I actually also have a branch keeping the first occurrence 
>>> https://github.com/elixir-lang/elixir/compare/master...sabiwara:enum_key_by_first?expand=1
>>>
>>> Le samedi 25 juillet 2020 11:47:55 UTC+9, Zachary Daniel a écrit :
>>>>
>>>> I like it, I write this function by hand all the time. I like the name, 
>>>> and I think that we should keep the first value found for each key.
>>>>
>>>> On Friday, July 24, 2020 at 10:34:27 PM UTC-4 sabi...@gmail.com wrote:
>>>>
>>>>> Hi! I would like to propose introducing an `Enum.key_by/3` function 
>>>>> (name to be discussed) that would return a map where:
>>>>> - each key is the result of the first callback applied to an item
>>>>> - the value is the result of the second callback applied to the item 
>>>>> (identity by default)
>>>>>
>>>>> It would basically be a copy of Enum.group_by/3 keeping only the last 
>>>>> (or first?) value for each key instead of building a list.
>>>>>
>>>>> Rationale:
>>>>>
>>>>> While it could be achieved easily enough using Enum.map/2 and 
>>>>> Map.new/1, or Enum.into/3, having a function for it could help making the 
>>>>> code more explicit about the intent and therefore more readable. Like 
>>>>> Enum.group_by/3, I think it is a fairly common operation and it might be 
>>>>> a 
>>>>> natural candidate for the standard library?
>>>>>
>>>>> Example use case: from a list of Ecto records, create a map of records 
>>>>> keyed by `id` for efficient lookups in future code:
>>>>>
>>>>> User |> Repo.all() |> Enum.key_by(fn user -> user.id end)
>>>>>
>>>>> If we want to build a map to lookup user names by their ids:
>>>>> User |> Repo.all() |> Enum.key_by(fn user -> user.id end, fn user -> 
>>>>> user.name end)
>>>>>
>>>>>
>>>>> Further considerations:
>>>>>
>>>>> The typical use cases I have in mind would rely on some kind of unique 
>>>>> key, so I'm not sure what would be the best API-wise when dealing with 
>>>>> duplicate keys and have no real opinion:
>>>>> - keep the last value found for each key
>>>>> - keep the first value found for each key
>>>>> This behaviour could always be changed using `Enum.reverse/1` if 
>>>>> needed.
>>>>>
>>>>> What do you think?
>>>>>
>>>>> I have a working branch for this here, happy to open a PR if you are 
>>>>> interested: 
>>>>> https://github.com/elixir-lang/elixir/compare/master...sabiwara:enum_key_by?expand=1
>>>>>
>>>> -- 
>>> 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-l...@googlegroups.com <javascript:>.
>>> To view this discussion on the web visit 
>>> https://groups.google.com/d/msgid/elixir-lang-core/b113e3c5-eb81-4484-a499-60700fb5dacfo%40googlegroups.com
>>>  
>>> <https://groups.google.com/d/msgid/elixir-lang-core/b113e3c5-eb81-4484-a499-60700fb5dacfo%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-l...@googlegroups.com <javascript:>.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4%2BAb_Gjk5ashZQ%3DJnsizkT_Yb52iDO81HSBUPuJY5%2Bdag%40mail.gmail.com
>>  
>> <https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4%2BAb_Gjk5ashZQ%3DJnsizkT_Yb52iDO81HSBUPuJY5%2Bdag%40mail.gmail.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/3a65a4c5-6af6-4076-950c-3c31563ccac4o%40googlegroups.com.

Reply via email to