99
1010class SelectMinimalOriginalDiffsAction
1111{
12+ /**
13+ * @param Collection<Collection<DiffMapping>> $diffs
14+ * @return Collection<DiffMapping>
15+ */
1216 public function execute (Collection $ diffs ): Collection
1317 {
14- $ keysProcessedInNewArray = [];
15-
16- return
17- $ diffs ->mapWithKeys (function (Collection $ diffMappings , int $ key ) use (&$ keysProcessedInNewArray ) {
18- $ returnMapping = [
19- "{$ key }" => $ diffMappings ->first (function (DiffMapping $ diffMapping ) use (&$ keysProcessedInNewArray ) {
20- return ! in_array ($ diffMapping ->getNewIndex (), $ keysProcessedInNewArray );
21- })
22- ];
23-
24- // No mapping to a new key was found
25- if ($ returnMapping ["{$ key }" ] !== null ) {
26- $ keysProcessedInNewArray [] = $ returnMapping ["{$ key }" ]->getNewIndex ();
27- }
28-
29- return $ returnMapping ;
18+ $ keysProcessedInNewArray = collect ();
19+
20+ do {
21+ $ addedMapping = false ;
22+
23+ $ diffs ->each (function (Collection $ diffMappings ) use (&$ keysProcessedInNewArray , &$ addedMapping ) {
24+ $ diffMappings ->each (function (DiffMapping $ diffMapping ) use (&$ keysProcessedInNewArray , &$ addedMapping ) {
25+ // If we find a diff mapping with less changes than an existing mapping, replace it
26+ if (
27+ $ keysProcessedInNewArray ->has ($ diffMapping ->getNewIndex ()) &&
28+ $ diffMapping
29+ ->getDiff ()
30+ ->getNumberOfChanges () >=
31+ $ keysProcessedInNewArray
32+ ->get ($ diffMapping ->getNewIndex ())
33+ ->getDiff ()
34+ ->getNumberOfChanges ()
35+ ) {
36+ return ;
37+ }
38+
39+ // Add the mapping
40+ $ keysProcessedInNewArray
41+ ->offsetSet (
42+ $ diffMapping ->getNewIndex (),
43+ $ diffMapping
44+ );
45+ $ addedMapping = true ;
46+ });
3047 });
48+ } while ($ addedMapping );
49+
50+ // For each original index, return the found diff mapping
51+ return $ keysProcessedInNewArray ->mapWithKeys (function (DiffMapping $ diffMapping ) {
52+ return [
53+ $ diffMapping ->getOriginalIndex () => $ diffMapping ,
54+ ];
55+ });
3156 }
3257}
0 commit comments