<div dir="ltr"><div>Ah, of course - that makes sense. I would still like to argue that maps are a good substitute for only some kinds of records and I see both data structures as more orthogonal than predecessor-successor but this isn't the right place for it and I don't want to derail the discussion (plus, I'm sure I'd find myself out of my depth in that discussion rather quickly!).</div><div><br></div><div>Thanks for pointing out the obvious that I have somehow missed.<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, 23 Sep 2019 at 14:15, Brujo Benavides <<a href="mailto:elbrujohalcon@gmail.com">elbrujohalcon@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div style="overflow-wrap: break-word;">There is some <i>historical</i><span style="font-style:normal"> context at play here, Karl.</span><div>Records (which are, in many occasions, the predecessors of maps) are tuples and therefore it’s not uncommon to find code that uses the functions listed by Vance to work with them. For instance…</div><div><br></div><div><span style="white-space:pre-wrap">        </span>find_user(UserName, Users) -></div><div><span style="white-space:pre-wrap">         </span>lists:keyfind(UserName, #user.username, Users).</div><div><br></div><div>If we move from records to maps as our means to implement users, then we need something like…</div><div><br></div><div><div><span style="white-space:pre-wrap">       </span>find_user(UserName, Users) -></div><div><span style="white-space:pre-wrap">         </span>case lists:dropwhile(fun(#{username := UN}) -> UN =/= UserName end, Users) of</div><div><span style="white-space:pre-wrap">                        </span>[] -> false;</div><div><span style="white-space:pre-wrap">                  </span>[User|_] -> User</div><div><span style="white-space:pre-wrap">              </span>end.</div></div><div><br></div><div>It would be <i>nice</i> if we don’t need to do that and instead can do…</div><div><br></div><div><div><span style="white-space:pre-wrap">     </span>find_user(UserName, Users) -></div><div><span style="white-space:pre-wrap">         </span>lists:keyfind_for_maps(UserName, username, Users).</div></div><div><br></div><div>Hope this helps :)</div><div><div>
<div style="color:rgb(0,0,0);font-family:"Trebuchet MS";font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><div><span id="gmail-m_3522204590032336435docs-internal-guid-e691a4cc-056a-0210-b8b7-ea8d87d888ad"><span style="font-size:11pt;font-family:Arial;font-weight:700;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><br><hr></span></span><div><b><i><a href="http://about.me/elbrujohalcon" target="_blank">Brujo Benavides</a></i></b></div></div></div><div style="color:rgb(0,0,0);font-family:"Trebuchet MS";font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><b><br></b></div><br>
</div>
<div><br><blockquote type="cite"><div>On 23 Sep 2019, at 08:07, Karl Velicka <<a href="mailto:karolis.velicka@gmail.com" target="_blank">karolis.velicka@gmail.com</a>> wrote:</div><br><div><div dir="ltr"><div>I'm afraid I can't see the equivalence in your example - I see a list of tuples as a list of values, whereas a list of maps is a list of containers. In my mind, a more apt comparison would be a list of maps vs a list of lists of tuples, and functions operating on the latter would strike me as an odd addition to stdlib.</div><div><br></div><div>I'd be curious to know what your usecase for these functions is. <br></div><div><br></div><div>Some of them can be trivially implemented:</div><div><br></div><div> keyfind(Key, MapList) -> hd(lists:filter(fun(Map) -> maps:is_key(Key, Map) end, MapList).</div><div><br></div><div>(The example implementation there is inefficient but I hope you get the idea)</div><div><br></div><div>Some others, like keysort(Key, MapList1) -> MapList2 don't quite make sense to me as the semantics are unclear.<br></div><div><br></div><div><br></div><div>I think elaborating on the use cases would help your proposal.</div><div><br></div><div>All the best,</div><div>Karl<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, 23 Sep 2019 at 09:00, Vance Shipley <<a href="mailto:vances@motivity.ca" target="_blank">vances@motivity.ca</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Should we have a corollary to lists:keyfind/3 which works on lists of map()?<br>
<br>
     keyfind(Key, MapList) -> Map | false<br>
<br>
... and the rest:<br>
<br>
     keydelete(Key, MapList1) -> MapList2<br>
     keymap(Fun, Key, MapList1) -> MapList2<br>
     keymember(Key, MapList) -> boolean()<br>
     keymerge(Key, MapList1, MapList2) -> MapList3<br>
     keyreplace(Key, MapList1, NewMap) -> MapList2<br>
     keysort(Key, MapList1) -> MapList2<br>
     keystore(Key, MapList1, NewMap) -> MapList2<br>
     keytake(Key, MapList1) -> {value, Map, MapList2} | false<br>
<br>
<br>
--<br>
     -Vance<br>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
</blockquote></div>
_______________________________________________<br>erlang-questions mailing list<br><a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br><a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br></div></blockquote></div><br></div></div></blockquote></div>