Skip to content

Commit 5bbdeb1

Browse files
authored
Merge pull request #75 from boesing/bugfix/unification-callback-only-duplicates
bugfix: only call callback for duplicates rather than all entries
2 parents 320b488 + 75dd5aa commit 5bbdeb1

File tree

3 files changed

+25
-5
lines changed

3 files changed

+25
-5
lines changed

src/OrderedList.php

+4-4
Original file line numberDiff line numberDiff line change
@@ -221,14 +221,14 @@ public function unify(
221221
$identifier = $unificationIdentifierGenerator($value);
222222
try {
223223
$unique = $unified->get($identifier);
224+
225+
if ($callback) {
226+
$unique = $callback($unique, $value);
227+
}
224228
} catch (OutOfBoundsException $exception) {
225229
$unique = $value;
226230
}
227231

228-
if ($callback) {
229-
$unique = $callback($unique, $value);
230-
}
231-
232232
$unified = $unified->put($identifier, $unique);
233233
}
234234

src/OrderedListInterface.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public function removeElement($element): OrderedListInterface;
8282

8383
/**
8484
* @psalm-param (callable(TValue):non-empty-string)|null $unificationIdentifierGenerator
85-
* @psalm-param (callable(TValue,TValue):TValue)|null $callback
85+
* @psalm-param (callable(TValue,TValue):TValue)|null $callback This callback is called for duplications only.
8686
* @psalm-return OrderedListInterface<TValue>
8787
*/
8888
public function unify(

tests/GenericOrderedListTest.php

+20
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@
2020
use function array_fill;
2121
use function array_map;
2222
use function array_reverse;
23+
use function assert;
2324
use function chr;
2425
use function in_array;
26+
use function is_int;
2527
use function json_encode;
2628
use function md5;
2729
use function mt_rand;
@@ -543,6 +545,24 @@ public function testUsesCallbackOnDeduplication(): void
543545
self::assertTrue($callbackCalled);
544546
}
545547

548+
public function testCallbackOnDeduplicationIsOnlyCalledForDuplicates(): void
549+
{
550+
$list = new GenericOrderedList([1, 2, 3, 1, 1, 1]);
551+
$callbackCalled = 0;
552+
553+
/**
554+
* @psalm-suppress UnusedMethodCall
555+
*/
556+
$list->unify(null, static function (int $duplicate, int $number) use (&$callbackCalled): int {
557+
self::assertEquals($duplicate, $number);
558+
assert(is_int($callbackCalled));
559+
$callbackCalled++;
560+
561+
return $number;
562+
});
563+
self::assertEquals(3, $callbackCalled);
564+
}
565+
546566
/**
547567
* @psalm-return Generator<string,array{0:list<mixed>,1:list<mixed>,2:(Closure(mixed):non-empty-string)|null}>
548568
*/

0 commit comments

Comments
 (0)