[erlang-questions] analogue of lists:keyfind and other lists:key*** functions for lists which contain maps

John Doe <>
Sun Nov 23 21:32:18 CET 2014


Yes, I was thinking about separate functions, like mapfind, mapmerge etc,
not about making a Frankenstein from lists:key** ones. Of course there's no
problem to write such simple library myself, but having built-in fast bifs
would be just more convenient as the more and more people will model
objects by maps instead of proplists, use lists of such objects in their
programs and expect CRUD operations over such lists.

There are 12 lists:key*** functions at the moment and it looks like it
makes sense to replicate all of them as lists:map*** ones. The edge error
cases will be "what to do when a map does not contain the key?". In this
case lists:key*** behave differently in different functions - lists:keymap
throws and exception when list contains a single non-tuple, lists:keydelete
allows such lists.

2014-11-23 17:43 GMT+03:00 Lukas Larsson <>:

> Hello,
>
> I agree with you that in certain situations they would be very convenient.
> I've myself already written these functions in a couple of modules.
>
> How do you imagine the semantics would work? It is fairly straight forward
> when the list only contains maps or tuples.
>
> lists:keyfind(you, name, [#{ name => me, from => here }, #{ name => you,
> from => there}]) returns #{ name => you, from => there}.
>
> But if we start to mix them some interesting corner cases pop up:
>
> lists:keyfind(2, 1,[#{ 2 => 3 },{2, 4},#{ 1 => 2 } ]) returns {2,4} or #{
> 1 => 2 }?
> lists:keyfind(1, id, [{1,2}, #{ id => 2}, #{ id => 1}) returns #{ id => 1
> } or crashes as id is not a valid key for {1,2}?
>
> Or error cases of today:
>
> lists:keyfind(2, id, []) today gives badarg, but should return false for a
> map list?
>
> The safest way to introduce these functions would be to create new ones
> called something like lists:mkeyfind, but if possible it would be very neat
> to use the same API. It really is unfortunate that lists:keyfind is so
> forgiving today, you can mix and match whatever you want in the list and
> keyfind will quietly ignore it.
>
> Also we have to consider which of the lists:key* functions we want a map
> counterpart? Does it make sense for all of them?
>
> Thoughts? Ideas? Suggestions?
>
> Lukas
>
>
> On Sat, Nov 22, 2014 at 7:33 PM, John Doe <> wrote:
>
>> It would be nice to extend lists module with a set of optimized functions
>> like lists:key*** for lists containing maps.
>>
>> _______________________________________________
>> erlang-questions mailing list
>> 
>> http://erlang.org/mailman/listinfo/erlang-questions
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20141124/74dbb46b/attachment.html>


More information about the erlang-questions mailing list