<html>
  <head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    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 class="moz-txt-link-freetext" href="maps:merge(X">maps:merge(X</a>, <a class="moz-txt-link-freetext" href="maps:map(fun(Key">maps:map(fun(Key</a>,
          Value) -></div>
        <div>                                                       case
          <a class="moz-txt-link-freetext" href="maps:find(Key">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" href="mailto:ivan@llaisdy.com"
                target="_blank"><a class="moz-txt-link-abbreviated" href="mailto:ivan@llaisdy.com">ivan@llaisdy.com</a></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"><a class="moz-txt-link-freetext" href="dict:merge/3">dict:merge/3</a></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"><a class="moz-txt-link-freetext" href="maps:merge(X">maps:merge(X</a></a>, <a
                            moz-do-not-send="true"><a class="moz-txt-link-freetext" href="maps:map(fun(Key">maps:map(fun(Key</a></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"
                              href="mailto:ivan@llaisdy.com"
                              target="_blank"><a class="moz-txt-link-abbreviated" href="mailto:ivan@llaisdy.com">ivan@llaisdy.com</a></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"><a class="moz-txt-link-freetext" href="dict:merge/3">dict:merge/3</a></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"><a class="moz-txt-link-freetext" href="maps:is_key(K">maps:is_key(K</a></a>,
                            Acc) of<br>
                                                      false -><br>
                                                          <a
                              moz-do-not-send="true"><a class="moz-txt-link-freetext" href="maps:put(K">maps:put(K</a></a>, V1,
                            Acc);<br>
                                                      true -><br>
                                                          V2 = <a
                              moz-do-not-send="true"><a class="moz-txt-link-freetext" href="maps:get(K">maps:get(K</a></a>,
                            Acc),<br>
                                                          <a
                              moz-do-not-send="true"><a class="moz-txt-link-freetext" href="maps:put(K">maps:put(K</a></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"
                              href="mailto:ivan@llaisdy.com"
                              target="_blank"><a class="moz-txt-link-abbreviated" href="mailto:ivan@llaisdy.com">ivan@llaisdy.com</a></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"
                              href="http://www.linkedin.com/in/ivanuemlianin"
                              rel="noreferrer" target="_blank"><a class="moz-txt-link-abbreviated" href="http://www.linkedin.com/in/ivanuemlianin">www.linkedin.com/in/ivanuemlianin</a></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 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>