@@ -19,11 +19,14 @@ public function execute(Collection $diffs): Collection
1919 $ originalToNewIndexMapping = collect ();
2020
2121 do {
22- $ addedMapping = false ;
22+ $ modifiedMapping = false ;
2323
24- $ diffs ->each (function (Collection $ diffMappings ) use (&$ originalToNewIndexMapping , &$ keysProcessedInNewArray , &$ addedMapping ): void {
25- $ diffMappings ->each (function (DiffMapping $ diffMapping ) use (&$ originalToNewIndexMapping , &$ keysProcessedInNewArray , &$ addedMapping ): void {
26- // If we find a diff mapping with lesser changes than an existing mapping, replace it
24+ $ diffs ->each (function (Collection $ diffMappings ) use (&$ originalToNewIndexMapping , &$ keysProcessedInNewArray , &$ modifiedMapping ): void {
25+ $ diffMappings ->each (function (DiffMapping $ diffMapping ) use (&$ originalToNewIndexMapping , &$ keysProcessedInNewArray , &$ modifiedMapping ): void {
26+ /*
27+ * If this diff mapping's new index has already been mapped, and it has fewer changes
28+ * skip this diff mapping.
29+ */
2730 if (
2831 $ keysProcessedInNewArray ->has ($ diffMapping ->getNewIndex ())
2932 && $ diffMapping
@@ -37,8 +40,10 @@ public function execute(Collection $diffs): Collection
3740 return ;
3841 }
3942
40- // If we have an existing diff mapping to the original index with lesser changes than the current
41- // diff mapping, skip replacing the mapping with the current index
43+ /*
44+ * If this diff mapping's original index has already been mapped, and it has fewer changes
45+ * skip this diff mapping.
46+ */
4247 if (
4348 $ originalToNewIndexMapping ->has ($ diffMapping ->getOriginalIndex ())
4449 && $ diffMapping
@@ -52,25 +57,38 @@ public function execute(Collection $diffs): Collection
5257 return ;
5358 }
5459
60+ // Changes will happen so we need to keep looping
61+ $ modifiedMapping = true ;
62+
5563 // Add the mapping
5664 $ keysProcessedInNewArray
5765 ->offsetSet (
5866 $ diffMapping ->getNewIndex (),
5967 $ diffMapping
6068 );
6169
62- // Add an original index to new index mapping to track if an original index has been mapped to a new
63- // index already
70+ /*
71+ * Add an original index to new index mapping to track if an original index has been mapped to a new
72+ * index already
73+ */
6474 $ originalToNewIndexMapping
6575 ->offsetSet (
6676 $ diffMapping ->getOriginalIndex (),
6777 $ diffMapping ->getNewIndex ()
6878 );
6979
70- $ addedMapping = true ;
80+ // Unmap any other original indexes that may have been mapped to this diff mapping's new index
81+ $ originalToNewIndexMapping
82+ ->filter (function ($ newIndex , $ originalIndex ) use ($ diffMapping ) {
83+ return $ originalIndex !== $ diffMapping ->getOriginalIndex () && $ newIndex === $ diffMapping ->getNewIndex ();
84+ })
85+ ->keys ()
86+ ->each (function ($ originalIndex ) use (&$ originalToNewIndexMapping ): void {
87+ $ originalToNewIndexMapping ->offsetUnset ($ originalIndex );
88+ });
7189 });
7290 });
73- } while ($ addedMapping );
91+ } while ($ modifiedMapping );
7492
7593 // For each original index, return the found diff mapping
7694 return $ keysProcessedInNewArray ->mapWithKeys (function (DiffMapping $ diffMapping ) {
0 commit comments