Skip to content

Commit 36ea4cd

Browse files
committed
Allows to deduplicate values using a function
1 parent d8c44e1 commit 36ea4cd

File tree

4 files changed

+25
-10
lines changed

4 files changed

+25
-10
lines changed

src/Reducer/Dedupe.php

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ class Dedupe implements Reducer
1818
*/
1919
private $next;
2020

21+
/**
22+
* @var callable|null
23+
*/
24+
private $callback;
25+
2126
/**
2227
* @var null|mixed
2328
*/
@@ -28,9 +33,10 @@ class Dedupe implements Reducer
2833
*/
2934
private $started = false;
3035

31-
public function __construct(Reducer $next)
36+
public function __construct(Reducer $next, ?callable $callback = null)
3237
{
3338
$this->next = $next;
39+
$this->callback = $callback;
3440
}
3541

3642
public function init()
@@ -40,21 +46,22 @@ public function init()
4046

4147
public function step($result, $current)
4248
{
43-
if (!$this->started || $current !== $this->last) {
49+
$compare = $this->callback === null ? $current : ($this->callback)($current);
50+
if (!$this->started || $compare !== $this->last) {
4451
$return = $this->next->step($result, $current);
4552
} else {
4653
$return = $result;
4754
}
4855
$this->started = true;
49-
$this->last = $current;
56+
$this->last = $compare;
5057

5158
return $return;
5259
}
5360

5461
public function complete($result)
5562
{
5663
$this->last = null;
57-
$this->started = false;
64+
$this->started = false;
5865

5966
return $this->next->complete($result);
6067
}

src/Transducer/transducers.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -343,15 +343,15 @@ function distinct($sequence = null, ?callable $callback = null)
343343
* @param null|mixed $sequence
344344
* @return \Closure
345345
*/
346-
function dedupe($sequence = null)
346+
function dedupe($sequence = null, ?callable $callback = null)
347347
{
348348
if ($sequence === null) {
349-
return function (Reducer $reducer) {
350-
return new Reducer\Dedupe($reducer);
349+
return function (Reducer $reducer) use ($callback) {
350+
return new Reducer\Dedupe($reducer, $callback);
351351
};
352352
}
353353

354-
return transduce(dedupe(), to_array(), $sequence);
354+
return transduce(dedupe(null, $callback), to_array(), $sequence);
355355
}
356356

357357
/**

src/Transformer.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,9 +242,9 @@ public function distinct(?callable $callback = null)
242242
/**
243243
* @return static
244244
*/
245-
public function dedupe()
245+
public function dedupe(?callable $callback = null)
246246
{
247-
return $this->appendComposition(t\dedupe());
247+
return $this->appendComposition(t\dedupe(null, $callback));
248248
}
249249

250250
/**

tests/Reducer/DedupeTest.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,14 @@ public function test_removes_consecutive_equals_items()
3333
self::assertEquals([1, 2, 3, 2, 4, 6, 5, 1, 0, 1], $deduped);
3434
}
3535

36+
public function test_removes_consecutive_equals_items_using_a_callable()
37+
{
38+
$deduped = (new Transformer([1, 2, 3, 2, 2, 4, 6, 5, 1, 0, 0, 1]))
39+
->dedupe(function (int $item) { return $item % 2; })->toArray();
40+
41+
self::assertEquals([1, 2, 3, 2, 5, 0, 1], $deduped);
42+
}
43+
3644
public function test_is_immutable()
3745
{
3846
$transformer = (new Transformer([1, 2, 3, 2, 2, 4, 6, 5, 1, 0, 0, 1]));

0 commit comments

Comments
 (0)