Skip to content

Commit

Permalink
Add Unpair operation.
Browse files Browse the repository at this point in the history
  • Loading branch information
drupol committed Aug 4, 2020
1 parent cd373c5 commit a94f3ee
Show file tree
Hide file tree
Showing 6 changed files with 109 additions and 0 deletions.
29 changes: 29 additions & 0 deletions docs/pages/api.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1090,6 +1090,34 @@ Signature: ``Collection::transpose();``
$result = Collection::with($records)
->transpose();
unpair
~~~~~~

Unpair a collection of pairs.

Interface: `Unpairable`_

Signature: ``Collection::unpair();``

.. code-block:: php
$input = [
'k1' => 'v1',
'k2' => 'v2',
'k3' => 'v3',
'k4' => 'v4',
];
$c = Collection::fromIterable($input)
->unpair();
// [
// ['k1', 'v1'],
// ['k2', 'v2'],
// ['k3', 'v3'],
// ['k4', 'v4'],
// ];
until
~~~~~

Expand Down Expand Up @@ -1346,6 +1374,7 @@ Interface: `Truthyable`_
.. _Transformable: https://github.com/loophp/collection/blob/master/src/Contract/Transformation/Transformable.php
.. _Transposeable: https://github.com/loophp/collection/blob/master/src/Contract/Operation/Transposeable.php
.. _Truthyable: https://github.com/loophp/collection/blob/master/src/Contract/Transformation/Truthyable.php
.. _Unpair: https://github.com/loophp/collection/blob/master/src/Contract/Operation/Unpairable.php
.. _Untilable: https://github.com/loophp/collection/blob/master/src/Contract/Operation/Untilable.php
.. _Unwrapable: https://github.com/loophp/collection/blob/master/src/Contract/Operation/Unwrapable.php
.. _Walkable: https://github.com/loophp/collection/blob/master/src/Contract/Operation/Walkable.php
Expand Down
19 changes: 19 additions & 0 deletions spec/loophp/collection/CollectionSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -1715,6 +1715,25 @@ public function it_can_truthy(): void
->shouldReturn(false);
}

public function it_can_unpair(): void
{
$input = [
'k1' => 'v1',
'k2' => 'v2',
'k3' => 'v3',
'k4' => 'v4',
];

$this::fromIterable($input)
->unpair()
->shouldIterateAs([
['k1', 'v1'],
['k2', 'v2'],
['k3', 'v3'],
['k4', 'v4'],
]);
}

public function it_can_until(): void
{
$collatz = static function (int $initial = 1): int {
Expand Down
6 changes: 6 additions & 0 deletions src/Collection.php
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@
use loophp\collection\Operation\Tail;
use loophp\collection\Operation\Times;
use loophp\collection\Operation\Transpose;
use loophp\collection\Operation\Unpair;
use loophp\collection\Operation\Until;
use loophp\collection\Operation\Unwrap;
use loophp\collection\Operation\Walk;
Expand Down Expand Up @@ -580,6 +581,11 @@ public function truthy(): bool
return $this->transform(new Truthy());
}

public function unpair(): CollectionInterface
{
return $this->run(new Unpair());
}

public function until(callable ...$callbacks): CollectionInterface
{
return $this->run(new Until(...$callbacks));
Expand Down
2 changes: 2 additions & 0 deletions src/Contract/Collection.php
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
use loophp\collection\Contract\Operation\Tailable;
use loophp\collection\Contract\Operation\Timesable;
use loophp\collection\Contract\Operation\Transposeable;
use loophp\collection\Contract\Operation\Unpairable;
use loophp\collection\Contract\Operation\Untilable;
use loophp\collection\Contract\Operation\Unwrapable;
use loophp\collection\Contract\Operation\Walkable;
Expand Down Expand Up @@ -226,6 +227,7 @@ interface Collection extends
Transformable,
Transposeable,
Truthyable,
Unpairable,
Untilable,
Unwrapable,
Walkable,
Expand Down
20 changes: 20 additions & 0 deletions src/Contract/Operation/Unpairable.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

declare(strict_types=1);

namespace loophp\collection\Contract\Operation;

use loophp\collection\Contract\Collection;

/**
* @psalm-template TKey
* @psalm-template TKey of array-key
* @psalm-template T
*/
interface Unpairable
{
/**
* @return \loophp\collection\Contract\Collection<int, array{TKey, T}>
*/
public function unpair(): Collection;
}
33 changes: 33 additions & 0 deletions src/Operation/Unpair.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

declare(strict_types=1);

namespace loophp\collection\Operation;

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

/**
* @psalm-template TKey
* @psalm-template TKey of array-key
* @psalm-template T
*/
final class Unpair extends AbstractOperation implements Operation
{
public function __invoke(): Closure
{
return
/**
* @psalm-param \Iterator<TKey, T> $iterator
*
* @psalm-return \Generator<TKey, T>
*/
static function (Iterator $iterator): Generator {
foreach ($iterator as $key => $value) {
yield [$key, $value];
}
};
}
}

0 comments on commit a94f3ee

Please sign in to comment.