Skip to content

Commit

Permalink
Implements Collection::compact() operation.
Browse files Browse the repository at this point in the history
  • Loading branch information
drupol committed Jul 16, 2020
1 parent 8930335 commit 9970d38
Show file tree
Hide file tree
Showing 6 changed files with 77 additions and 0 deletions.
15 changes: 15 additions & 0 deletions docs/pages/api.rst
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,20 @@ Signature: ``Collection::combine(...$keys);``
$collection = Collection::with(['a', 'b', 'c', 'd'])
->combine('w', 'x', 'y', 'z')
compact
~~~~~~~

Remove all the null values from the collection.

Interface: `Compactable`_

Signature: ``Collection::compact();``

.. code-block:: php
$collection = Collection::with(['a', 1 => 'b', null, false, 0, 'c'];)
->combine();
cycle
~~~~~

Expand Down Expand Up @@ -1129,6 +1143,7 @@ Interface: `Truthyable`_
.. _Columnable: https://github.com/loophp/collection/blob/master/src/Contract/Operation/Columnable.php
.. _Combinateable: https://github.com/loophp/collection/blob/master/src/Contract/Operation/Combinateable.php
.. _Combineable: https://github.com/loophp/collection/blob/master/src/Contract/Operation/Combineable.php
.. _Compactable: https://github.com/loophp/collection/blob/master/src/Contract/Operation/Compactable.php
.. _Containsable: https://github.com/loophp/collection/blob/master/src/Contract/Transformation/Containsable.php
.. _Cycleable: https://github.com/loophp/collection/blob/master/src/Contract/Operation/Cycleable.php
.. _Distinctable: https://github.com/loophp/collection/blob/master/src/Contract/Operation/Distinctable.php
Expand Down
9 changes: 9 additions & 0 deletions spec/loophp/collection/CollectionSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -372,6 +372,15 @@ public function it_can_combine(): void
->during('all');
}

public function it_can_compact(): void
{
$input = ['a', 1 => 'b', null, false, 0, 'c'];

$this::fromIterable($input)
->compact()
->shouldIterateAs(['a', 1 => 'b', 3 => false, 4 => 0, 5 => 'c']);
}

public function it_can_contains(): void
{
$this::fromIterable(range('A', 'C'))
Expand Down
6 changes: 6 additions & 0 deletions src/Collection.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
use loophp\collection\Operation\Column;
use loophp\collection\Operation\Combinate;
use loophp\collection\Operation\Combine;
use loophp\collection\Operation\Compact;
use loophp\collection\Operation\Cycle;
use loophp\collection\Operation\Distinct;
use loophp\collection\Operation\Explode;
Expand Down Expand Up @@ -120,6 +121,11 @@ public function combine(...$keys): BaseInterface
return $this->run(new Combine(...$keys));
}

public function compact(): BaseInterface
{
return $this->run(new Compact());
}

public function contains($key): bool
{
return $this->transform(new Contains($key));
Expand Down
2 changes: 2 additions & 0 deletions src/Contract/Collection.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
use loophp\collection\Contract\Operation\Columnable;
use loophp\collection\Contract\Operation\Combinateable;
use loophp\collection\Contract\Operation\Combineable;
use loophp\collection\Contract\Operation\Compactable;
use loophp\collection\Contract\Operation\Cycleable;
use loophp\collection\Contract\Operation\Distinctable;
use loophp\collection\Contract\Operation\Explodeable;
Expand Down Expand Up @@ -79,6 +80,7 @@ interface Collection extends
Columnable,
Combinateable,
Combineable,
Compactable,
Containsable,
Cycleable,
Distinctable,
Expand Down
17 changes: 17 additions & 0 deletions src/Contract/Operation/Compactable.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 Compactable
{
/**
* Combine a collection of items with some other keys.
*
* @return \loophp\collection\Base|\loophp\collection\Contract\Collection
*/
public function compact(): Base;
}
28 changes: 28 additions & 0 deletions src/Operation/Compact.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

declare(strict_types=1);

namespace loophp\collection\Operation;

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

final class Compact extends AbstractOperation implements Operation
{
public function __invoke(): Closure
{
return static function (iterable $collection): Generator {
return yield from
(new Run(
new Filter(
static function ($item): bool {
return null !== $item;
}
)
)
)($collection);
};
}
}

0 comments on commit 9970d38

Please sign in to comment.