Skip to content

Commit

Permalink
zipWithNext() operation
Browse files Browse the repository at this point in the history
  • Loading branch information
bradynpoulsen committed Nov 9, 2019
1 parent 797f0a7 commit 855212d
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 1 deletion.
54 changes: 54 additions & 0 deletions src/Operations/Stateless/ZippingWithNextSequence.php
@@ -0,0 +1,54 @@
<?php

declare(strict_types=1);

namespace BradynPoulsen\Sequences\Operations\Stateless;

use BradynPoulsen\Sequences\DeferredIterator;
use BradynPoulsen\Sequences\Iteration\Iterations;
use BradynPoulsen\Sequences\Sequence;
use BradynPoulsen\Sequences\Traits\CommonOperationsTrait;
use Generator;
use Traversable;

/**
* @internal
*/
final class ZippingWithNextSequence implements Sequence
{
use CommonOperationsTrait;

/**
* @var Sequence
*/
private $previous;

/**
* @var callable (T $a, T $b) -> R
*/
private $transform;

public function __construct(Sequence $previous, ?callable $transform = null)
{
$this->previous = $previous;
$this->transform = $transform ?? function ($a, $b): array {
return [$a, $b];
};
}

public function getIterator(): Traversable
{
return new DeferredIterator(function (): Generator {
$iteration = Iterations::fromTraversable($this->previous->getIterator());
if (!$iteration->hasNext()) {
return;
}
$current = $iteration->pluckNext();
while ($iteration->hasNext()) {
$next = $iteration->pluckNext();
yield call_user_func($this->transform, $current, $next);
$current = $next;
}
});
}
}
12 changes: 12 additions & 0 deletions src/Sequence.php
Expand Up @@ -754,4 +754,16 @@ public function windowed(
* @return Sequence Sequence<A> -> Sequence<R>
*/
public function zip(Sequence $other, ?callable $transform = null): Sequence;

/**
* Returns a sequence containing the results of applying the given $transform function, if provided, to an each pair
* of two adjacent elements in this sequence.
*
* @effect intermediate
* @state stateless
*
* @param callable|null $transform (T $a, T $b) -> R
* @return Sequence Sequence<T> -> Sequence<R>
*/
public function zipWithNext(?callable $transform = null): Sequence;
}
11 changes: 10 additions & 1 deletion src/Traits/StatelessOperationsTrait.php
Expand Up @@ -14,7 +14,8 @@
TakeSequence,
TakeWhileSequence,
TransformingSequence,
ZippingSequence
ZippingSequence,
ZippingWithNextSequence
};
use BradynPoulsen\Sequences\Sequence;
use InvalidArgumentException;
Expand Down Expand Up @@ -161,4 +162,12 @@ public function zip(Sequence $other, ?callable $transform = null): Sequence
{
return new ZippingSequence($this, $other, $transform);
}

/**
* @see Sequence::zipWithNext()
*/
public function zipWithNext(?callable $transform = null): Sequence
{
return new ZippingWithNextSequence($this, $transform);
}
}

0 comments on commit 855212d

Please sign in to comment.