Skip to content

Commit

Permalink
New Diff and DiffKeys operation.
Browse files Browse the repository at this point in the history
  • Loading branch information
drupol committed Jul 22, 2020
1 parent 63762eb commit 1cac685
Show file tree
Hide file tree
Showing 7 changed files with 148 additions and 0 deletions.
24 changes: 24 additions & 0 deletions spec/loophp/collection/CollectionSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -568,6 +568,30 @@ public function it_can_cycle(): void
->shouldIterateAs($generator());
}

public function it_can_diff(): void
{
$this::fromIterable(range(1, 5))
->diff(1, 2, 3, 9)
->shouldIterateAs([3 => 4, 4 => 5]);

$this::fromIterable(range(1, 5))
->diff()
->shouldIterateAs(range(1, 5));
}

public function it_can_diffKeys(): void
{
$input = array_combine(range('a', 'e'), range(1, 5));

$this::fromIterable($input)
->diffKeys('b', 'd')
->shouldIterateAs(['a' => 1, 'c' => 3, 'e' => 5]);

$this::fromIterable($input)
->diffKeys()
->shouldIterateAs($input);
}

public function it_can_distinct(): void
{
$stdclass = new stdClass();
Expand Down
12 changes: 12 additions & 0 deletions src/Collection.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
use loophp\collection\Operation\Combine;
use loophp\collection\Operation\Compact;
use loophp\collection\Operation\Cycle;
use loophp\collection\Operation\Diff;
use loophp\collection\Operation\DiffKeys;
use loophp\collection\Operation\Distinct;
use loophp\collection\Operation\Explode;
use loophp\collection\Operation\Filter;
Expand Down Expand Up @@ -149,6 +151,16 @@ public function cycle(?int $length = null): BaseInterface
return $this->run(new Cycle($length));
}

public function diff(...$values): BaseInterface
{
return $this->run(new Diff(...$values));
}

public function diffKeys(...$values): BaseInterface
{
return $this->run(new DiffKeys(...$values));
}

public function distinct(): BaseInterface
{
return $this->run(new Distinct());
Expand Down
4 changes: 4 additions & 0 deletions src/Contract/Collection.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
use loophp\collection\Contract\Operation\Combineable;
use loophp\collection\Contract\Operation\Compactable;
use loophp\collection\Contract\Operation\Cycleable;
use loophp\collection\Contract\Operation\Diffable;
use loophp\collection\Contract\Operation\Diffkeysable;
use loophp\collection\Contract\Operation\Distinctable;
use loophp\collection\Contract\Operation\Explodeable;
use loophp\collection\Contract\Operation\Filterable;
Expand Down Expand Up @@ -86,6 +88,8 @@ interface Collection extends
Compactable,
Containsable,
Cycleable,
Diffable,
Diffkeysable,
Distinctable,
Explodeable,
Falsyable,
Expand Down
17 changes: 17 additions & 0 deletions src/Contract/Operation/Diffable.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

declare(strict_types=1);

namespace loophp\collection\Contract\Operation;

use loophp\collection\Contract\Base;

interface Diffable
{
/**
* @param mixed ...$values
*
* @return \loophp\collection\Base|\loophp\collection\Contract\Collection
*/
public function diff(...$values): Base;
}
17 changes: 17 additions & 0 deletions src/Contract/Operation/Diffkeysable.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

declare(strict_types=1);

namespace loophp\collection\Contract\Operation;

use loophp\collection\Contract\Base;

interface Diffkeysable
{
/**
* @param mixed ...$values
*
* @return \loophp\collection\Base|\loophp\collection\Contract\Collection
*/
public function diffKeys(...$values): Base;
}
37 changes: 37 additions & 0 deletions src/Operation/Diff.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

declare(strict_types=1);

namespace loophp\collection\Operation;

use Closure;
use Generator;
use loophp\collection\Contract\Operation;

use function in_array;

final class Diff extends AbstractOperation implements Operation
{
/**
* @param mixed ...$values
*/
public function __construct(...$values)
{
$this->storage['values'] = $values;
}

public function __invoke(): Closure
{
return
/**
* @param array<int, mixed> $values
*/
static function (iterable $collection, $values): Generator {
foreach ($collection as $key => $value) {
if (false === in_array($value, $values, true)) {
yield $key => $value;
}
}
};
}
}
37 changes: 37 additions & 0 deletions src/Operation/DiffKeys.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

declare(strict_types=1);

namespace loophp\collection\Operation;

use Closure;
use Generator;
use loophp\collection\Contract\Operation;

use function in_array;

final class DiffKeys extends AbstractOperation implements Operation
{
/**
* @param mixed ...$values
*/
public function __construct(...$values)
{
$this->storage['values'] = $values;
}

public function __invoke(): Closure
{
return
/**
* @param array<int, mixed> $values
*/
static function (iterable $collection, $values): Generator {
foreach ($collection as $key => $value) {
if (false === in_array($key, $values, true)) {
yield $key => $value;
}
}
};
}
}

0 comments on commit 1cac685

Please sign in to comment.