<html>
  <head>
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    Dear Alexander, Hynek<br>
    <br>
    That is a *lot* faster! :D <br>
    <br>
    Thanks very much both.<br>
    <br>
    Ivan<br>
    <br>
    <br>
    <div class="moz-cite-prefix">On 08/26/15 10:38, Ivan Uemlianin
      wrote:<br>
    </div>
    <blockquote cite="mid:55DD8933.10001@llaisdy.com" type="cite">
      <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
      Oh yes of course that's better.  Thanks<br>
      <br>
      Ivan<br>
      <br>
      <br>
      <div class="moz-cite-prefix">On 26/08/2015 10:32, Hynek Vychodil
        wrote:<br>
      </div>
      <blockquote
cite="mid:CAL_wnpdX2F9vtRd_YGjmMTscwhRcBD830+Mhfg+Zd-reYvKCSg@mail.gmail.com"
        type="cite">
        <div dir="ltr">
          <div>I would consider:</div>
          <div><br>
          </div>
          <div>merge_ap(F, [Head | Tail]) -></div>
          <div>    lists:foldl(fun(Y, X) -></div>
          <div>                        <a moz-do-not-send="true"
              class="moz-txt-link-freetext" href="maps:merge%28X">maps:merge(X</a>,
            <a moz-do-not-send="true" class="moz-txt-link-freetext"
              href="maps:map%28fun%28Key">maps:map(fun(Key</a>, Value)
            -></div>
          <div>                                                     
             case <a moz-do-not-send="true"
              class="moz-txt-link-freetext" href="maps:find%28Key">maps:find(Key</a>,
            X) of</div>
          <div>                                                         
             {ok, V} -> F(Key, V, Value);</div>
          <div>                                                         
             error    -> Value</div>
          <div>                                                     
             end<br>
          </div>
          <div>                                               end,</div>
          <div>                                               Y))</div>
          <div>                end,</div>
          <div>                Head,</div>
          <div>                Tail).</div>
          <div class="gmail_extra"><br>
            <div class="gmail_quote">On Wed, Aug 26, 2015 at 10:45 AM,
              Ivan Uemlianin <span dir="ltr"><<a
                  moz-do-not-send="true"
                  class="moz-txt-link-abbreviated"
                  href="mailto:ivan@llaisdy.com">ivan@llaisdy.com</a>></span>
              wrote:<br>
              <blockquote class="gmail_quote" style="margin:0px 0px 0px
0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
                <div bgcolor="#FFFFFF" text="#000000"> Dear Alexander<br>
                  <br>
                  Thanks!  That looks excellent!<br>
                  <br>
                  I notice that your function F is different from the <a
                    moz-do-not-send="true" class="moz-txt-link-freetext"
                    href="dict:merge/3">dict:merge/3</a> function:
                  instead of taking a key and the two values, is takes
                  two values, defaulting the first to 0.  <br>
                  <br>
                  I've put my case clause into your framework:<br>
                  <br>
                  merge_ap(F, [Head | Tail]) -><span class=""><br>
                        lists:foldl(fun(Y, X) -><br>
                                            <a moz-do-not-send="true">maps:merge(X</a>,
                    <a moz-do-not-send="true">maps:map(fun(Key</a>,
                    Value) -><br>
                  </span>
                                                                        
                  case <a moz-do-not-send="true">maps:is_key(Key</a>,
                  X) of<br>
                                                                            

                  false -><br>
                                                                                


                  Value;<br>
                                                                            

                  true -><br>
                                                                                


                  F(Key, Value, <a moz-do-not-send="true">maps:get(Key</a>,
                  X))<br>
                                                                        
                  end<span class=""><br>
                                                                   end,<br>
                                                                   Y))<br>
                                    end,<br>
                                    Head,<br>
                                    Tail).<br>
                    <br>
                  </span> This has desired behaviour, and will probably
                  still perform well.  Using lists:foldl is a brilliant
                  idea.<br>
                  <br>
                  Best wishes<span class=""><font color="#888888"><br>
                      <br>
                      Ivan</font></span>
                  <div>
                    <div class="h5"><br>
                      <br>
                      <br>
                      <div>On 26/08/2015 09:16, Alexander Petrovsky
                        wrote:<br>
                      </div>
                      <blockquote type="cite">
                        <div dir="ltr">Hi!
                          <div><br>
                          </div>
                          <div>I've make some little benchmarks, and
                            noticed that the most effective way is:</div>
                          <div><br>
                          </div>
                          <div>merge(F, [Head | Tail]) -></div>
                          <div>    lists:foldl(fun(Y, X) -> <a
                              moz-do-not-send="true"
                              class="moz-txt-link-freetext"
                              href="maps:merge%28X">maps:merge(X</a>, <a
                              moz-do-not-send="true"
                              class="moz-txt-link-freetext"
                              href="maps:map%28fun%28Key">maps:map(fun(Key</a>,
                            Value) -> F(<a moz-do-not-send="true">maps:get(Key</a>,
                            X, 0), Value) end, Y)) end, Head, Tail).</div>
                          <div><br>
                          </div>
                        </div>
                        <div class="gmail_extra"><br>
                          <div class="gmail_quote">2015-08-23 20:05
                            GMT+03:00 Ivan Uemlianin <span dir="ltr"><<a
                                moz-do-not-send="true"
                                class="moz-txt-link-abbreviated"
                                href="mailto:ivan@llaisdy.com">ivan@llaisdy.com</a>></span>:<br>
                            <blockquote class="gmail_quote"
                              style="margin:0px 0px 0px
0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Dear

                              All<br>
                              <br>
                              The maps module does not have a merge/3
                              like <a moz-do-not-send="true">dict:merge/3</a>,
                              which calls a function fun(Key, Val1,
                              Val2) when both dicts have the same key. 
                              From the documentation, "If a key occurs
                              in both dictionaries then Fun is called
                              with the key and both values to return a
                              new value."<br>
                              <br>
                              The dict documentation says that <a
                                moz-do-not-send="true"
                                class="moz-txt-link-freetext"
                                href="dict:merge/3">dict:merge/3</a> is
                              faster than an equivalent implemented in
                              erlang.<br>
                              <br>
                              <a moz-do-not-send="true"
                                href="http://www.erlang.org/doc/man/dict.html#merge-3"
                                rel="noreferrer" target="_blank">http://www.erlang.org/doc/man/dict.html#merge-3</a><br>
                              <br>
                              Why does the maps module not have a
                              similar merge/3?  Is it because writing
                              our own erlang implementation is at fast
                              as it gets?<br>
                              <br>
                              Below is an implementation which seems to
                              work.  Can it be made faster?<br>
                              <br>
                              <br>
                              merge_maps(Fun, M1, M2) -><br>
                                  <a moz-do-not-send="true">maps:fold(fun(K</a>,
                              V1, Acc) -><br>
                                                    case <a
                                moz-do-not-send="true"
                                class="moz-txt-link-freetext"
                                href="maps:is_key%28K">maps:is_key(K</a>,
                              Acc) of<br>
                                                        false -><br>
                                                            <a
                                moz-do-not-send="true"
                                class="moz-txt-link-freetext"
                                href="maps:put%28K">maps:put(K</a>, V1,
                              Acc);<br>
                                                        true -><br>
                                                            V2 = <a
                                moz-do-not-send="true"
                                class="moz-txt-link-freetext"
                                href="maps:get%28K">maps:get(K</a>,
                              Acc),<br>
                                                            <a
                                moz-do-not-send="true"
                                class="moz-txt-link-freetext"
                                href="maps:put%28K">maps:put(K</a>,
                              Fun(K, V1, V2), Acc)<br>
                                                    end<br>
                                            end,<br>
                                            M1,<br>
                                            M2).<br>
                              <br>
                              merge_maps_test() -><br>
                                  merge_maps(fun(_K, V1, V2) -> V1 +
                              V2 end,<br>
                                             #{a => 1, b => 2, c
                              => 3},<br>
                                             #{b => 2, c => 3, d
                              => 4}) =:=<br>
                                      #{a => 1, b => 4, c => 6,
                              d => 4}.<br>
                              <br>
                              <br>
                              With thanks and best wishes<br>
                              <br>
                              Ivan<br>
                              <br>
                              -- <br>
============================================================<br>
                              Ivan A. Uemlianin PhD<br>
                              Llaisdy<br>
                              Speech Technology Research and Development<br>
                              <br>
                                                  <a
                                moz-do-not-send="true"
                                class="moz-txt-link-abbreviated"
                                href="mailto:ivan@llaisdy.com">ivan@llaisdy.com</a><br>
                                                      @llaisdy<br>
                                                       <a
                                moz-do-not-send="true"
                                href="http://llaisdy.wordpress.com"
                                rel="noreferrer" target="_blank">llaisdy.wordpress.com</a><br>
                                            <a moz-do-not-send="true"
                                href="http://github.com/llaisdy"
                                rel="noreferrer" target="_blank">github.com/llaisdy</a><br>
                                                   <a
                                moz-do-not-send="true"
                                class="moz-txt-link-abbreviated"
                                href="http://www.linkedin.com/in/ivanuemlianin">www.linkedin.com/in/ivanuemlianin</a><br>
                              <br>
                                                      festina lente<br>
============================================================<br>
                              <br>
_______________________________________________<br>
                              erlang-questions mailing list<br>
                              <a moz-do-not-send="true"
                                href="mailto:erlang-questions@erlang.org"
                                target="_blank">erlang-questions@erlang.org</a><br>
                              <a moz-do-not-send="true"
                                href="http://erlang.org/mailman/listinfo/erlang-questions"
                                rel="noreferrer" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
                            </blockquote>
                          </div>
                          <br>
                          <br clear="all">
                          <div><br>
                          </div>
                          -- <br>
                          <div>
                            <div dir="ltr">Петровский Александр /
                              Alexander Petrovsky,<br>
                              <br>
                              Skype: askjuise<br>
                              <div>Phone: +7 914 8 820 815
                                <div><br>
                                </div>
                              </div>
                            </div>
                          </div>
                        </div>
                      </blockquote>
                      <br>
                      <pre cols="72">-- 
============================================================
Ivan A. Uemlianin PhD
Llaisdy
Speech Technology Research and Development

                    <a moz-do-not-send="true" href="mailto:ivan@llaisdy.com" target="_blank">ivan@llaisdy.com</a>
                        @llaisdy
                         <a moz-do-not-send="true" href="http://llaisdy.wordpress.com" target="_blank">llaisdy.wordpress.com</a>
              <a moz-do-not-send="true" href="http://github.com/llaisdy" target="_blank">github.com/llaisdy</a>
                     <a moz-do-not-send="true" href="http://www.linkedin.com/in/ivanuemlianin" target="_blank">www.linkedin.com/in/ivanuemlianin</a>

                        festina lente
============================================================ </pre>
                    </div>
                  </div>
                </div>
                <br>
                _______________________________________________<br>
                erlang-questions mailing list<br>
                <a moz-do-not-send="true"
                  href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
                <a moz-do-not-send="true"
                  href="http://erlang.org/mailman/listinfo/erlang-questions"
                  rel="noreferrer" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
                <br>
              </blockquote>
            </div>
            <br>
          </div>
        </div>
      </blockquote>
      <br>
      <pre class="moz-signature" cols="72">-- 
============================================================
Ivan A. Uemlianin PhD
Llaisdy
Speech Technology Research and Development

                    <a moz-do-not-send="true" class="moz-txt-link-abbreviated" href="mailto:ivan@llaisdy.com">ivan@llaisdy.com</a>
                        @llaisdy
                         llaisdy.wordpress.com
              github.com/llaisdy
                     <a moz-do-not-send="true" class="moz-txt-link-abbreviated" href="http://www.linkedin.com/in/ivanuemlianin">www.linkedin.com/in/ivanuemlianin</a>

                        festina lente
============================================================ </pre>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
erlang-questions mailing list
<a class="moz-txt-link-abbreviated" href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a>
<a class="moz-txt-link-freetext" href="http://erlang.org/mailman/listinfo/erlang-questions">http://erlang.org/mailman/listinfo/erlang-questions</a>
</pre>
    </blockquote>
    <br>
    <pre class="moz-signature" cols="72">-- 
============================================================
Ivan A. Uemlianin PhD
Llaisdy
Speech Technology Research and Development

                    <a class="moz-txt-link-abbreviated" href="mailto:ivan@llaisdy.com">ivan@llaisdy.com</a>
                        @llaisdy
                         llaisdy.wordpress.com
              github.com/llaisdy
                     <a class="moz-txt-link-abbreviated" href="http://www.linkedin.com/in/ivanuemlianin">www.linkedin.com/in/ivanuemlianin</a>

                        festina lente
============================================================ 

</pre>
  </body>
</html>