Download the PHP package sanmai/pipeline without Composer

On this page you can find all versions of the php package sanmai/pipeline. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.

Please rate this library. Is it a good library?

All versions of pipeline with dependencies

Informations about the package pipeline

Latest Stable Version Build Status CI Coverage Status Mutation testing badge Type Coverage

Pipeline makes dealing with iterable types as easy as it can be, making it a perfect tool for bespoke data processing pipelines, hence the name. If you ever piped together several bash commands where one command uses output of another in succession, this library does just that but for PHP functions, generators, arrays, and iterators.

Pipeline comes with the most important yet basic building blocks. It boasts methods to map, filter, reduce, zip, and unpack data from arbitrary generators and from all kinds of standard iterators.

This rigorously tested library just works. Pipeline neither defines nor throws any exceptions.


composer require sanmai/pipeline

The latest version requires PHP 7.1 or above, including PHP 8.0.

There are earlier versions that work under PHP 5.6 and above, but they are not as feature complete.


API entry points

All entry points always return an instance of a standard pipeline.

Method Details Use with
map() Takes an optional initial callback, where it must not require any arguments. Other than that, works just like an instance method below. use function Pipeline\map;
take() Takes any iterable, including arrays, initializes a standard pipeline with it. use function Pipeline\take;
fromArray() Takes an array, initializes a standard pipeline with it. use function Pipeline\fromArray;
zip() Takes an iterable, and several more, merging them together. use function Pipeline\zip;

Instance methods in a nutshell

Method Details A.K.A.
map() Takes an optional callback that for each input value may return one or yield many. Also takes an initial generator, where it must not require any arguments. Provided no callback does nothing. Also available as a plain function. SelectMany
cast() Takes a callback that for each input value expected to return another single value. Unlike map(), it assumes no special treatment for generators. Provided no callback does nothing. array_map, Select
zip() Takes a number of iterables, merging them together with the current sequence, if any. array_map(null, ...$array), Python's zip(), transposition
unpack() Unpacks arrays into arguments for a callback. Flattens inputs if no callback provided. flat_map, flatten
filter() Removes elements unless a callback returns true. Removes falsey values if no callback provided. array_filter, Where
slice() Extracts a slice from the inputs. Keys are not discarded intentionally. Suppors negative values for both arguments. array_slice
reduce() Reduces input values to a single value. Defaults to summation. Requires an initial value. array_reduce, Aggregate, Sum
toArray() Returns an array with all values. Eagerly executed. dict, ToDictionary
__construct() Can be provided with an optional initial iterator. Used in the take() function from above. Not part of any interface as per LSP.

Pipeline is an iterator and can be used as any other iterable.

Pipeline can be used as an argument to count(). Implements Countable. Be warned that operation of counting values is a terminal operation.

Pipeline is a final class. It comes with an interface to aid you with composition over inheritance.

In general, Pipeline instances are mutable, meaning every Pipeline-returning method returns the very same Pipeline instance. This gives us great flexibility on trusting someone or something to add processing stages to a Pipeline instance, while also avoiding non-obivius mistakes, raised from a need to strictly follow a fluid interface. E.g. if you add a processing stage, it stays there no matter if you capture the return value or not. This peculiarity could have been a thread-safety hazard in other circumstances, but under PHP this is not an issue.


Classes and interfaces: overview

This library is built to last. There's not a single place where an exception is thrown. Never mind any asserts whatsoever.

Inheritance diagram



Takes an instance of Traversable or none. In the latter case the pipeline must be primed by passing an initial generator to the map method. This method is not part to any interface, as per LSP.


Takes a processing stage in a form of a generator function or a plain mapping function. Provided no callback does nothing.

Can also take an initial generator, where it must not require any arguments.


An extra variant of map which unpacks arrays into arguments for a callback.

Where with map() you would use:

With unpack() these things are done behind the scene for you:

You can have all kinds of standard type checks with ease too.

With no callback, the default callback for unpack() will flatten inputs:


Works similarly to map, but does not have a special treatment for generators. Think of array_map.

For this example, where map() would have filled the pipeline with a series of payments, cast() will add a generator for each customer.


Sequence-joins several iterables together, forming a feed with elements side by side:

With iterators with unequal number of elements, missing elements are left as nulls.


Takes a filter callback not unlike that of array_filter.

Standard pipeline has a default callback with the same effect as in array_filter: it'll remove all falsy values.


Takes offset and length arguments, functioning in a very similar fashion to how array_slice does with $preserve_keys set to true.

This example will remove first and last elements of the sequence.

Implementation uses a rolling window buffer for negative values of offset and length, and falls back on plain old array_slice for input arrays.


Takes a reducing callback not unlike that of array_reduce with two arguments for the value of the previous iteration and for the current item. As a second argument it can take an inital value.

Standard pipeline has a default callback that sums all values.


Returns an array with all values from a pipeline. All array keys are ignored to make sure every single value is returned.

If in the example about one would use iterator_to_array($result) they would get just [3, 4].


A method to conform to the Traversable interface. In case of unprimed \Pipeline\Standard it'll return an empty array iterator, essentially a no-op pipeline. Therefore this should work without errors:

This allows to skip type checks for return values if one has no results to return: instead of false or null it is safe to return an unprimed pipeline.


Contributions to documentation and test cases are welcome. Bug reports are welcome too.

API is expected to stay as simple as it is, though.

About collection pipelines in general

About collection pipelines programming pattern by Martin Fowler.

In a more general sense this library implements a subset of CSP paradigm, as opposed to Actor model.

What else is out there:

More badges

Codacy Badge License FOSSA Status

Requires php Version ^7.1 || ^8.0

The package sanmai/pipeline contains the following files

Loading the files please wait ....