Skip to content

Commit

Permalink
Merge pull request #75 from boesing/bugfix/unification-callback-only-…
Browse files Browse the repository at this point in the history
…duplicates

bugfix: only call callback for duplicates rather than all entries
  • Loading branch information
boesing committed Jun 7, 2021
2 parents 320b488 + 75dd5aa commit 5bbdeb1
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 5 deletions.
8 changes: 4 additions & 4 deletions src/OrderedList.php
Original file line number Diff line number Diff line change
Expand Up @@ -221,14 +221,14 @@ public function unify(
$identifier = $unificationIdentifierGenerator($value);
try {
$unique = $unified->get($identifier);

if ($callback) {
$unique = $callback($unique, $value);
}
} catch (OutOfBoundsException $exception) {
$unique = $value;
}

if ($callback) {
$unique = $callback($unique, $value);
}

$unified = $unified->put($identifier, $unique);
}

Expand Down
2 changes: 1 addition & 1 deletion src/OrderedListInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ public function removeElement($element): OrderedListInterface;

/**
* @psalm-param (callable(TValue):non-empty-string)|null $unificationIdentifierGenerator
* @psalm-param (callable(TValue,TValue):TValue)|null $callback
* @psalm-param (callable(TValue,TValue):TValue)|null $callback This callback is called for duplications only.
* @psalm-return OrderedListInterface<TValue>
*/
public function unify(
Expand Down
20 changes: 20 additions & 0 deletions tests/GenericOrderedListTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,10 @@
use function array_fill;
use function array_map;
use function array_reverse;
use function assert;
use function chr;
use function in_array;
use function is_int;
use function json_encode;
use function md5;
use function mt_rand;
Expand Down Expand Up @@ -543,6 +545,24 @@ public function testUsesCallbackOnDeduplication(): void
self::assertTrue($callbackCalled);
}

public function testCallbackOnDeduplicationIsOnlyCalledForDuplicates(): void
{
$list = new GenericOrderedList([1, 2, 3, 1, 1, 1]);
$callbackCalled = 0;

/**
* @psalm-suppress UnusedMethodCall
*/
$list->unify(null, static function (int $duplicate, int $number) use (&$callbackCalled): int {
self::assertEquals($duplicate, $number);
assert(is_int($callbackCalled));
$callbackCalled++;

return $number;
});
self::assertEquals(3, $callbackCalled);
}

/**
* @psalm-return Generator<string,array{0:list<mixed>,1:list<mixed>,2:(Closure(mixed):non-empty-string)|null}>
*/
Expand Down

0 comments on commit 5bbdeb1

Please sign in to comment.