=================
Reactive Extension
=================
What is it?
============
The reactive extensions for PHP are a set of libraries to compose asynchronous
and event-based programs using observable collections and LINQ-style query operators in PHP.
Iterating
============
each
------------
Collections can be iterated and/or transformed into new collections with the each() and map() methods. The each()
method will not create a new collection, but will allow you to modify any objects within the collection:
.. code-block:: php
    use Collection\ArrayList;
    $collection = new ArrayList($items);
    $collection = $collection->each(function ($value, $key) {
        echo "Element $key: $value";
    });
map
------------
The map() method will create a new collection based on the output of the callback being applied to each
object in the original collection:
.. code-block:: php
    use Collection\Dictionary;
    $items = ['a' => 1, 'b' => 2, 'c' => 3];
    $collection = new Dictionary($items);
    $new = $collection->map(function ($value, $key) {
        return $value * 2;
    });
    // $result contains [2, 4, 6];
    $result = $new->toArray();
The map() method will create a new iterator which lazily creates the resulting items when iterated.
extract
------------
One of the most common uses for a map() function is to extract a single column from a collection. If you are
looking to build a list of elements containing the values for a particular property, you can use the
extract() method:
.. code-block:: php
    use Collection\ArrayList;
    $collection = new ArrayList($people);
    $names = $collection->extract('name');
    // $result contains ['mark', 'jose', 'barbara'];
    $result = $names->toArray();
As with many other functions in the collection class, you are allowed to specify a dot-separated path
for extracting columns. This example will return a collection containing the author names from a list
of articles:
.. code-block:: php
    use Collection\ArrayList;
    $collection = new ArrayList($articles);
    $names = $collection->extract('author.name');
    // $result contains ['Maria', 'Stacy', 'Larry'];
    $result = $names->toArray();
Finally, if the property you are looking after cannot be expressed as a path, you can use a callback
function to return it:
.. code-block:: php
    use Collection\ArrayList;
    $collection = new ArrayList($articles);
    $names = $collection->extract(function ($article) {
        return $article->author->name . ', ' . $article->author->last_name;
    });
combine
------------
The map() method will create a new collection based on the output of the callback being applied to each
object in the original collection:
.. code-block:: php
    use Collection\ArrayList;
    $items = [
        ['id' => 1, 'name' => 'foo', 'parent' => 'a'],
        ['id' => 2, 'name' => 'bar', 'parent' => 'b'],
        ['id' => 3, 'name' => 'baz', 'parent' => 'a'],
    ];
    $combined = (new ArrayList($items))->combine('id', 'name');
    // Result will look like this when converted to array
    [
        1 => 'foo',
        2 => 'bar',
        3 => 'baz',
    ];
You can also optionally use a groupPath to group results based on a path: 
  |