<div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr">On Mon, Nov 14, 2016 at 9:20 PM Michael Truog <<a href="mailto:mjtruog@gmail.com">mjtruog@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br class="gmail_msg">
The main merge function you are missing in the maps module, is the merge/3 (instead of merge/2) that is common in other modules (like the dict/orddict modules).  I added an implementation of merge/3 at <a href="https://github.com/okeuday/mapsd" rel="noreferrer" class="gmail_msg" target="_blank">https://github.com/okeuday/mapsd</a> due to needing the dict API elsewhere.  With the merge/3 function it should be easier to merge nested maps, in whatever way is required, since one size shouldn't fit all.<br class="gmail_msg"></blockquote><div><br></div><div>In OCaml, you often have a merge-function like this one:<br><br><div class="inbox-inbox-def"><span class="inbox-inbox-keyword">val</span>
        merge : ('k, 'v1, 'cmp) <a href="https://ocaml.janestreet.com/ocaml-core/113.33/doc/core/Std/Map.mod/#/t.typ">t</a> -> ('k, 'v2, 'cmp) <a href="https://ocaml.janestreet.com/ocaml-core/113.33/doc/core/Std/Map.mod/#/t.typ">t</a> -> f:(key:'k -> [ 
    
    <div class="inbox-inbox-cons">
      |
      
      
        `Left
        <span class="inbox-inbox-keyword">of</span>
          'v1
          
        </div>
  
    
    
    <div class="inbox-inbox-cons">
      |
      
      
        `Right
        <span class="inbox-inbox-keyword">of</span>
          'v2
          
        </div>
  
    
    
    <div class="inbox-inbox-cons">
      |
      
      
        `Both
        <span class="inbox-inbox-keyword">of</span>
          'v1
    * 'v2
          
        </div>
  
    
  
  
   ] -> 'v3 option) -> ('k, 'v3, 'cmp) <a href="https://ocaml.janestreet.com/ocaml-core/113.33/doc/core/Std/Map.mod/#/t.typ">t</a><br><br></div><div class="inbox-inbox-def">which means that you have to supply a function of the form<br><br></div><div class="inbox-inbox-def">fun<br></div><div class="inbox-inbox-def">  (K, {left, VL}) -> Res;<br></div><div class="inbox-inbox-def">  (K, {right, VR}) -> Res;<br></div><div class="inbox-inbox-def">  (K, {both, VL, VR}) -> Res<br></div><div class="inbox-inbox-def">end<br><br></div><div class="inbox-inbox-def">where Res is either undefined | {ok, Result} for some result value. The semantics are that left,right, and both encodes on which side the value was in the input maps. And the Res encodes if a new value should be produced in the new map.<br></div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
_______________________________________________<br class="gmail_msg">
erlang-questions mailing list<br class="gmail_msg">
<a href="mailto:erlang-questions@erlang.org" class="gmail_msg" target="_blank">erlang-questions@erlang.org</a><br class="gmail_msg">
<a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" class="gmail_msg" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br class="gmail_msg">
</blockquote></div></div>