Skip to content

Commit

Permalink
Refactor the operations.
Browse files Browse the repository at this point in the history
  • Loading branch information
drupol committed Jun 20, 2020
1 parent cdd94a3 commit df85420
Show file tree
Hide file tree
Showing 50 changed files with 341 additions and 754 deletions.
7 changes: 4 additions & 3 deletions spec/loophp/collection/CollectionSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
use Iterator;
use loophp\collection\Collection;
use loophp\collection\Contract\Operation;
use loophp\collection\Operation\AbstractOperation;
use OutOfRangeException;
use PhpSpec\ObjectBehavior;
use stdClass;
Expand Down Expand Up @@ -1130,7 +1131,7 @@ public function it_can_rsample(): void

public function it_can_run_an_operation(Operation $operation): void
{
$square = new class() implements Operation {
$square = new class() extends AbstractOperation implements Operation {
public function __invoke(): Closure
{
return static function ($collection): Generator {
Expand All @@ -1141,7 +1142,7 @@ public function __invoke(): Closure
}
};

$sqrt = new class() implements Operation {
$sqrt = new class() extends AbstractOperation implements Operation {
public function __invoke(): Closure
{
return static function ($collection) {
Expand All @@ -1152,7 +1153,7 @@ public function __invoke(): Closure
}
};

$map = new class() implements Operation {
$map = new class() extends AbstractOperation implements Operation {
public function __invoke(): Closure
{
return static function ($collection) {
Expand Down
13 changes: 13 additions & 0 deletions src/Contract/Operation.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,17 @@ interface Operation
* @return Closure
*/
public function __invoke(): Closure;

/**
* @param string $key
* @param mixed|null $default
*
* @return mixed|null
*/
public function get(string $key, $default = null);

/**
* @return array<string, mixed>
*/
public function getArguments(): array;
}
2 changes: 1 addition & 1 deletion src/Contract/Transformation/Transformable.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ interface Transformable
/**
* @param \loophp\collection\Contract\Transformation ...$transformers
*
* @return array<mixed>|bool|int|\loophp\collection\Iterator\ClosureIterator|mixed|string
* @return array<mixed>|bool|bool|int|\loophp\collection\Iterator\ClosureIterator|mixed|string
*/
public function transform(Transformation ...$transformers);
}
33 changes: 33 additions & 0 deletions src/Operation/AbstractOperation.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 function array_key_exists;

abstract class AbstractOperation
{
/**
* @var array
*/
protected $storage = [];

/**
* @param string $key
* @param mixed $default
*
* @return mixed
*/
public function get(string $key, $default = null)
{
return array_key_exists($key, $this->storage) ?
$this->storage[$key] :
$default;
}

public function getArguments(): array
{
return $this->storage;
}
}
16 changes: 3 additions & 13 deletions src/Operation/Append.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,34 +8,24 @@
use Generator;
use loophp\collection\Contract\Operation;

/**
* Class Append.
*/
final class Append implements Operation
final class Append extends AbstractOperation implements Operation
{
/**
* @var array|mixed[]
*/
private $items;

/**
* Append constructor.
*
* @param mixed ...$items
*/
public function __construct(...$items)
{
$this->items = $items;
$this->storage['items'] = $items;
}

/**
* {@inheritdoc}
*/
public function __invoke(): Closure
{
$items = $this->items;

return static function (iterable $collection) use ($items): Generator {
return static function (iterable $collection, array $items): Generator {
foreach ($collection as $value) {
yield $value;
}
Expand Down
16 changes: 3 additions & 13 deletions src/Operation/Apply.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,34 +8,24 @@
use Generator;
use loophp\collection\Contract\Operation;

/**
* Class Apply.
*/
final class Apply implements Operation
final class Apply extends AbstractOperation implements Operation
{
/**
* @var callable[]
*/
private $callbacks;

/**
* Apply constructor.
*
* @param callable ...$callbacks
*/
public function __construct(callable ...$callbacks)
{
$this->callbacks = $callbacks;
$this->storage['callbacks'] = $callbacks;
}

/**
* {@inheritdoc}
*/
public function __invoke(): Closure
{
$callbacks = $this->callbacks;

return static function (iterable $collection) use ($callbacks): Generator {
return static function (iterable $collection, array $callbacks): Generator {
foreach ($collection as $key => $value) {
foreach ($callbacks as $callback) {
if (true === $callback($value, $key)) {
Expand Down
26 changes: 9 additions & 17 deletions src/Operation/Chunk.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,45 +12,37 @@

use function count;

/**
* Class Chunk.
*/
final class Chunk implements Operation
final class Chunk extends AbstractOperation implements Operation
{
/**
* @var array<int, int>
*/
private $size;

/**
* Chunk constructor.
*
* @param int ...$size
*/
public function __construct(int ...$size)
{
$this->size = $size;
$this->storage['size'] = $size;
}

/**
* {@inheritdoc}
*/
public function __invoke(): Closure
{
$size = $this->size;

return static function (iterable $collection) use ($size): Generator {
$size = new IterableIterator((new Collection($size))->loop());
return static function (iterable $collection, array $sizes): Generator {
$sizes = new IterableIterator(
(new Collection($sizes))->loop()
);

$values = [];

foreach ($collection as $value) {
if (0 >= $size->current()) {
if (0 >= $sizes->current()) {
return yield from [];
}

if (count($values) === $size->current()) {
$size->next();
if (count($values) === $sizes->current()) {
$sizes->next();

yield $values;

Expand Down
5 changes: 1 addition & 4 deletions src/Operation/Collapse.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,7 @@
use Generator;
use loophp\collection\Contract\Operation;

/**
* Class Collapse.
*/
final class Collapse implements Operation
final class Collapse extends AbstractOperation implements Operation
{
/**
* {@inheritdoc}
Expand Down
31 changes: 13 additions & 18 deletions src/Operation/Column.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,39 +9,34 @@
use loophp\collection\Contract\Operation;
use loophp\collection\Transformation\Run;

/**
* Class Column.
*/
final class Column implements Operation
final class Column extends AbstractOperation implements Operation
{
/**
* @var int|string
*/
private $column;

/**
* Column constructor.
*
* @param int|string $column
*/
public function __construct($column)
{
$this->column = $column;
$this->storage['column'] = $column;
}

/**
* {@inheritdoc}
*/
public function __invoke(): Closure
{
$column = $this->column;

return static function (iterable $collection) use ($column): Generator {
foreach ((new Run((new Transpose())))($collection) as $key => $value) {
if ($key === $column) {
return yield from $value;
return
/**
* @param int|string $column
* @param iterable $collection
*/
static function (iterable $collection, $column): Generator {
foreach ((new Run((new Transpose())))($collection) as $key => $value) {
if ($key === $column) {
return yield from $value;
}
}
}
};
};
}
}
31 changes: 8 additions & 23 deletions src/Operation/Combinate.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,43 +13,28 @@
use function array_slice;
use function count;

/**
* Class Combinate.
*/
final class Combinate implements Operation
final class Combinate extends AbstractOperation implements Operation
{
/**
* @var int|null
*/
private $length;

/**
* Combinate constructor.
*
* @param int $length
*/
public function __construct(?int $length = null)
{
$this->length = $length;
$this->storage = [
'length' => $length,
'getCombinations' => function (array $dataset, int $length): Generator {
return $this->getCombinations($dataset, $length);
},
];
}

/**
* {@inheritdoc}
*/
public function __invoke(): Closure
{
$length = $this->length;

$getCombinations = function (array $dataset, int $length): Generator {
return $this->getCombinations($dataset, $length);
};

return static function (iterable $collection) use ($length, $getCombinations): Generator {
return static function (iterable $collection, ?int $length, callable $getCombinations): Generator {
$dataset = (new All())($collection);

if (0 < $length) {
// TODO: Investigate why it's calling issues with PHPStan.
/** @phpstan-ignore-next-line */
return yield from $getCombinations($dataset, $length);
}

Expand Down
19 changes: 3 additions & 16 deletions src/Operation/Combine.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,37 +12,24 @@

use const E_USER_WARNING;

/**
* Class Combine.
*
* @template TKey
* @template TValue
*/
final class Combine implements Operation
final class Combine extends AbstractOperation implements Operation
{
/**
* @var array<array<TKey, TValue>>
*/
private $keys;

/**
* Combine constructor.
*
* @param mixed ...$keys
*/
public function __construct(...$keys)
{
$this->keys = $keys;
$this->storage['keys'] = $keys;
}

/**
* {@inheritdoc}
*/
public function __invoke(): Closure
{
$keys = $this->keys;

return static function (iterable $collection) use ($keys): Generator {
return static function (iterable $collection, array $keys): Generator {
$original = new IterableIterator($collection);
$keysIterator = new ArrayIterator($keys);

Expand Down

0 comments on commit df85420

Please sign in to comment.