title: Intelligent Merge of two Arrays (3-way-kindof)
body: <p>I have two Arrays, each represents a list of Stories. Two users can concurrently modify the order, add or remove Stories, and I want those changes merged.</p>
  
  <p>An example should make this clearer</p>
  
  <pre><code>Original       1,2,3,4,5
  UserA (mine)   3,1,2,4,5 (moved story 3 to start)
  UserB (theirs) 1,2,3,5,4 (moved story 5 forward)
  </code></pre>
  
  <p>The result of the above should be </p>
  
  <pre><code>Merge (result) 3,1,2,5,4
  </code></pre>
  
  <p>In case of conflicts, UserA should always win.</p>
  
  <p>I came pretty far with this simple approach. First i deleted whatever mine says i should deleted (that part of the code is not shown, it's trivial), then I iterate over mine, inserting and moving from theirs what is needed (mstories = mine, tstories = theirs):</p>
  
  <pre><code>     for (var idx=0;idx&lt;mstories.length;idx++) {
          var storyId = mstories[idx];
  
          // new story by theirs
          if (tstories[idx] !== undefined &amp;&amp; mstories.indexOf(tstories[idx]) == -1) {
             mstories.splice(idx+1, 0, tstories[idx]);
             idx--;
             continue;
          }
          // new story by mine
          if (tstories.indexOf(storyId) == -1 &amp;&amp; ostories.indexOf(storyId) == -1) {
             tstories.splice(idx+offset, 0, storyId);
             offset += 1;
          // story moved by me
          } else if ((tstories.indexOf(storyId) != idx + offset) &amp;&amp; ostories.indexOf(storyId) != idx) {
             tstories.splice(tstories.indexOf(storyId), 1);
             tstories.splice(idx+offset, 0, storyId);
          // story moved by them
          } else if (tstories.indexOf(storyId) != idx + offset) {
             mstories.splice(mstories.indexOf(storyId), 1);
             mstories.splice(idx+offset, 0, storyId);
             mdebug(storyId, 'S moved by them, moffset--');
          }
       }
       result = tstories
  </code></pre>
  
  <p>It's close, but it gets confused when too many Stories are moved to the front / back with Stories in between, which the other User touched.</p>
  
  <p>I have an extended version which does checks on the original and is smarter - holding 2 offsets, etc - , but I feel like this is a problem that must have a) a name b) a perfect solution and i don't want to re-invent it.</p>