PHPackages                             snelling/sequence - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. snelling/sequence

ActiveProject

snelling/sequence
=================

1.0.2(9y ago)017MITPHPPHP &gt;=7.0

Since Apr 20Pushed 9y ago1 watchersCompare

[ Source](https://github.com/snellingio/sequence)[ Packagist](https://packagist.org/packages/snelling/sequence)[ RSS](/packages/snelling-sequence/feed)WikiDiscussions master Synced 2mo ago

READMEChangelog (4)Dependencies (2)Versions (7)Used By (0)

Sequence
========

[](#sequence)

This library provides a different approach to the pipeline pattern. The pipeline pattern is often compared to a production line, where each stage performs a certain operation on a given payload/subject. Stages can act on, manipulate, decorate, or even replace the payload.

The goals of this library are:

- Be small in size
- Be simple to understand
- Make writing code natural

**Warning**: You may not like the amount of magic that happens internally. With that said, take a look at the examples, and the source code. It's currently at ~150 LOC.

If you would like to know more:

- [Martin Fowler](https://martinfowler.com/articles/collection-pipeline/) has written extensively about collection pipelines.
- [The PHP League](http://pipeline.thephpleague.com/) has a very good pipeline package. This package inspired mine.

License
-------

[](#license)

MIT License

Setup
-----

[](#setup)

There are two objects

### Sequence Object

[](#sequence-object)

```
$sequence = (new Sequence)
    ->then(Callable)
    ->then(Callable, null);

$sequence->run(Payload);
```

### Payload Object

[](#payload-object)

The payload object is a provided way to magically containerize values that you can send through your sequence.

```
$payload = new Payload();

$payload->number = 1;       // Sets a number object to 1
echo $payload->number;      // Will return 1

$payload->setNumber(2);     // Sets the number object to 2
echo $payload->getNumber(); // Will return 2
echo $payload->number;      // Will return 2

echo $payload->notset;      // Will throw exception

$payload->setNotSet(true);  // Set the notset object
echo $payload->notset;      // Will return true
```

Basic Example
-------------

[](#basic-example)

If you're familiar with `League\Pipeline`, you'll be right at home. Here is an exact replica of chaining sequences:

```
class TimesTwoStage
{
    public function __invoke($payload)
    {
        return $payload * 2;
    }
}

class AddOneStage
{
    public function __invoke($payload)
    {
        return $payload + 1;
    }
}

$sequence = (new Sequence)
    ->then(new TimesTwoStage)
    ->then(new AddOneStage);

// Returns 21
$sequence->run(10);
```

Callable
--------

[](#callable)

```
class TimesTwoStage
{
    public function __invoke($payload)
    {
        return $payload * 2;
    }
}

$sequence = (new Sequence)
    ->then(new TimesTwoStage)
    ->then(function ($payload) {
        return $payload + 1;
    });

// Returns 21
$sequence->run(10);
```

Re-usable
---------

[](#re-usable)

```
class TimesTwoStage
{
    public function __invoke($payload)
    {
        return $payload * 2;
    }
}

class AddOneStage
{
    public function __invoke($payload)
    {
        return $payload + 1;
    }
}

$minusSequence = (new Sequence)
    ->then(function ($payload) {
        return $payload - 2;    // 2
    });

$sequence = (new Sequence)
    ->then(new TimesTwoStage)   // 1
    ->then($minusSequence)      // 2
    ->then(new AddOneStage);    // 3

// Returns 19
echo $sequence->run(10);
```

Exception handling
------------------

[](#exception-handling)

```
$sequence = (new Sequence)
    ->then(function () {
        throw new LogicException();
    });

try {
    $sequence->run($payload);
} catch (LogicException $e) {
    // Handle the exception.
}
```

Payload
-------

[](#payload)

```
$payload         = new Payload();
$payload->number = 0;

$sequence = (new Sequence)
    ->then(function ($payload) {
        $payload->number = 1;

        return $payload;
    });

$payload = $sequence->run($payload);

// Returns 1
echo $payload->number;
```

Payload return into key
-----------------------

[](#payload-return-into-key)

```
$payload         = new Payload();
$payload->number = 0;

$sequence = (new Sequence)
    ->then(function () {
        return 1;
    }, 'number');

$payload = $sequence->run($payload);

// Returns 1
echo $payload->number;
```

Payload dependency injection
----------------------------

[](#payload-dependency-injection)

```
$payload         = new Payload();
$payload->number = 0;

// Will automatically input $payload->number into $number
$sequence = (new Sequence)
    ->then(function ($number) {
        return ($number + 1);
    }, 'number');

$payload = $sequence->run($payload);

// Returns 1
echo $payload->number;
```

Payload dependency injection with typehints
-------------------------------------------

[](#payload-dependency-injection-with-typehints)

```
class Multiplier
{
    private $multiple;

    public function __construct(float $multiple)
    {
        $this->multiple = $multiple;
    }

    public function getMultiple(): float
    {
        return $this->multiple;
    }
}

class Multiply
{
    public function __invoke(Multiplier $multiplier, int $number)
    {
        return ($number * $multiplier->getMultiple());
    }
}

$payload             = new Payload();
$payload->multiplier = new Multiplier(2);
$payload->number     = 0;

$sequence = (new Sequence)
    ->then(function ($number) {
        return ($number + 1);
    }, 'number')                        // Will return 1
    ->then(new Multiply, 'number');     // Will return 1 * 2 = 2

$payload = $sequence->run($payload);

// Returns 2
echo $payload->number;
```

###  Health Score

26

—

LowBetter than 43% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity6

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity62

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~1 days

Total

6

Last Release

3303d ago

Major Versions

0.1.0 → 01.02017-04-20

0.1.1 → 1.0.12017-04-20

### Community

Maintainers

![](https://www.gravatar.com/avatar/7a37f810a66179a1246036739392736412ab4530b3c45b5eafc13244a9ec2be0?d=identicon)[snellingio](/maintainers/snellingio)

---

Top Contributors

[![snellingio](https://avatars.githubusercontent.com/u/9887585?v=4)](https://github.com/snellingio "snellingio (6 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/snelling-sequence/health.svg)

```
[![Health](https://phpackages.com/badges/snelling-sequence/health.svg)](https://phpackages.com/packages/snelling-sequence)
```

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
