jcstrandburg / demeter
Colllection library
Installs: 11
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
pkg:composer/jcstrandburg/demeter
Requires
- php: ^7.0
- jcstrandburg/extension-methods: ^1.1
Requires (Dev)
- phpunit/phpunit: ^7.3
README
This library provides a set of immutable collection classes that allow for an consistent, object oriented, fluent style of manipulating data collections. It is mainly inspired by LINQ from C# and the Java Stream API.
Installing
composer require jcstrandburg\demeter
Usage
Vanilla PHP:
$x = array_slice( array_map( function ($x) {return $x * 2;}, array_filter([1, 2, 3, 4, 5], function ($x) {return $x % 2 == 1;})), 0, 2);
With Demeter:
use function Jcstrandburg\Demeter\sequence; use Jcstrandburg\Demeter\Lambda; $x = sequence([1, 2, 3, 4, 5]) ->filter(Lambda::isOdd()) ->map(Lambda::multiplyBy(2)) ->take(2);
Features
Version History
Unreleased
0.8
Added
Extensionsstatic class for extension method support
0.7
Changes
- All collection classes now implement
IteratorAggregateinstead of extendingIteratorIterator GroupedCollection::getGroupKeysnow returns aCollectioninstead of an array- It is now possible to safely perform concurrent iterations over the same
Sequenceor derivations thereof.
For example, if $x = sequence([1,2,3,4]);
Before: $x->zip($x->map(Lambda::plus(1)), Lambda::add())->toArray() == [3,6]
Now: $x->zip($x->map(Lambda::plus(1)), Lambda::add())->toArray() == [3,5,7,9]
Removed
LazyRewindableIteratorhas been replaced with an internal implementation
Added
as_iteratorutility function
Deprecated
as_traversable- useas_iteratorinstead
0.6
Fixed
- Call the parent constructor from
ArrayGroupedCollection
Changed
- Breaking: Convert
GroupedCollectionto an interface, with the existing implementation becomingArrayGroupedCollection - Breaking: Convert
Groupingto an interface, with the existing implementation becomingArrayGrouping - Make
CollectionextendCountable xrangenow returns aSequence
Added
Lambda::constantLambda::toArrayLambda::getGroupKeySequence::zipSequence::chunkSequence::joinSequence::implode
0.5
Changed
- Breaking: Changed the behavior of
HashSetso that it acts like a proper set (hashing is used for buckets but not equality comparisons) - Breaking: Convert
Sequenceto an interface, with the existing implementation becomingLazySequence - Breaking: Convert
Collectionto an interface, with the existing implementation becomingArrayCollection - Breaking: Convert
Dictionaryto an interface, with the existing implementation becomingArrayDictionary - Breaking: Functions previously returning
HashSetnow returnSet
Added
- Introduce
Setinterface whichHashSetimplements Sequence::exceptandSequence::intersectLambdautility classdictionaryandsetfactory functions
0.4
Added
HashMap::addManyHashMap::removeManySequence::toDictionaryDictionary
0.3
Changed
sequenceandcollectnow will return their argument unmodified if is already of the correct type
Added
HashSetSequence::asSetSequence::firstSequence::firstOrNullSequence::lastSequence::lastOrNullSequence::singleSequence::singleOrNull
0.2
Added
Sequence::groupByGroupedCollectionGrouping
0.1
Added
SequenceCollection- Various utility functions
LazyRewindableIteratorMappedIteratorSkipWhileIteratorTakeWhileIterator
License
This project is licensed under the MIT License - see the LICENSE.md file for details