commit 512d04ff19a93027bdac30a142b0dd91144075f6 Author: CismonX Date: Tue Mar 20 22:44:25 2018 +0800 initial commit diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ab9b4fc --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2018 CismonX + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..19b5d9d --- /dev/null +++ b/README.md @@ -0,0 +1,40 @@ +# ext-collections + +## 1. Introduction + +This PHP extension provides a set of useful functional-style operations on PHP arrays, which makes array manipulation simple and scalable. + +Method names and functionalities are inspired by [Kotlin.Collections](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/). + +It may take me a really long time to fully implement this extension. Feel free to contribute. + +## 2. Documentation + +See [stubs](stubs/) directory for signature of all classes and methods of this extension, with PHPDoc. + +## 3. Example + +Here is a simple example. + +```php +$employees = [ + ['name' => 'Alice', 'sex' => 'female', 'age' => 35], + ['name' => 'Bob', 'sex' => 'male', 'age' => 29], + ['name' => 'David', 'sex' => 'male', 'age' => 40], + ['name' => 'Benjamin', 'sex' => 'male', 'age' => 32] +]; +// Trying to get an array of names of male employees, +// sorted by the descending order of their age. +$names = Collection::init($employees) + ->filter(function ($it) { + return $it->get('sex') == 'male'; + }) + ->sortedByDescending(function ($it) { + return $it->get('age'); + }) + ->map(function ($it) { + return $it->get('name'); + }) + ->toArray(); +``` + diff --git a/stubs/Collection.php b/stubs/Collection.php new file mode 100644 index 0000000..e82bac6 --- /dev/null +++ b/stubs/Collection.php @@ -0,0 +1,884 @@ + bool + * @return bool + */ + function all($predicate) {} + + /** + * Returns true if at least one element matches the given predicate. + * + * @param callable $predicate ($value, $key) -> bool + * @return bool + */ + function any($predicate) {} + + /** + * Returns a collection containing key-value pairs provided by transform function applied + * to elements of the given collection. + * + * @param callable $transform ($value) -> Pair + * @return Collection + */ + function associate($transform) {} + + /** + * Populates and returns the destination collection with key-value pairs provided by transform + * function applied to each element of the given collection. + * + * @param Collection $destination + * @param callable $transform ($value) -> Pair + * @return Collection + */ + function associateTo($destination, $transform) {} + + /** + * Returns a collection containing the elements from the given collection indexed by the key + * returned from keySelector function applied to each element. + * + * @param callable $key_selector ($value) -> $key + * @return Collection + */ + function associateBy($key_selector) {} + + /** + * Populates and returns the destination collection with key-value pairs, where key is + * provided by the keySelector function applied to each element of the given collection + * and value is the element itself. + * + * @param Collection $destination + * @param callable $key_selector ($value) -> $key + * @return Collection + */ + function associateByTo($destination, $key_selector) {} + + /** + * Returns an average value of elements in the collection. + * + * @return double + */ + function average() {} + + /** + * Checks if all elements in the specified collection are contained in this collection. + * + * @param Collection $collection + * @return bool + */ + function containsAll($collection) {} + + /** + * Checks if the array contains the given key. + * + * @param int|string $element + * @return bool + */ + function containsKey($element) {} + + /** + * Check if the array maps one or more keys to the specified value. + * + * @param mixed $element + * @return bool + */ + function containsValue($element) {} + + /** + * Returns new array which is a copy of the original array. + * + * @param Collection $collection + * @param int $new_size[optional] + * @return Collection + */ + function copyOf($collection, $new_size) {} + + /** + * Returns new array which is a copy of range of original array. + * + * @param int $from_index + * @param int $to_index + * @return Collection + */ + function copyOfRange($from_index, $to_index) {} + + /** + * Returns the number of elements in this array. + * + * @return int + */ + function count() {} + + /** + * Returns a collection containing only distinct elements from the given array. + * + * @return Collection + */ + function distinct() {} + + /** + * Returns a collection containing only elements from the given array having distinct keys + * returned by the given selector function. + * + * @param callable $selector ($value, $key) -> $key + * @return Collection + */ + function distinctBy($selector) {} + + /** + * Returns a list containing all elements except first n elements. + * + * @param int $n + * @return Collection + */ + function drop($n) {} + + /** + * Returns a collection containing all elements except last n elements. + * + * @param int $n + * @return Collection + */ + function dropLast($n) {} + + /** + * Returns a collection containing all elements except last elements that satisfy + * the given predicate. + * + * @param callable $predicate ($value, $key) -> bool + * @return Collection + */ + function dropLastWhile($predicate) {} + + /** + * Returns a collection containing all elements except first elements that satisfy + * the given predicate. + * + * @param $predicate $predicate ($value, $key) -> bool + * @return Collection + */ + function dropWhile($predicate) {} + + /** + * Fills original array with the provided value. + * + * @param mixed $element + * @param int $from_index[optional] + * @param int $to_index[optional] + * @return Collection + */ + function fill($element, $from_index, $to_index) {} + + /** + * Returns a collection containing only elements matching the given predicate. + * + * @param callable $predicate ($value, $key) -> bool + * @return Collection + */ + function filter($predicate) {} + + /** + * Returns a collection containing only elements not matching the given predicate. + * + * @param callable $predicate ($value, $key) -> bool + * @return Collection + */ + function filterNot($predicate) {} + + /** + * Appends all elements not matching the given predicate to the given destination. + * + * @param Collection $destination + * @param callable $predicate ($value, $key) -> bool + * @return Collection + */ + function filterNotTo($destination, $predicate) {} + + /** + * Appends all elements matching the given predicate to the given destination. + * + * @param Collection $destination + * @param callable $predicate ($value, $key) -> bool + * @return Collection + */ + function filterTo($destination, $predicate) {} + + /** + * Returns the first element matching the given predicate, or null if no such + * element was found. + * + * @param callable $predicate ($value) -> bool + * @return mixed + */ + function find($predicate) {} + + /** + * Returns the last element matching the given predicate, or null if no such + * element was found. + * + * @param callable $predicate ($value) -> bool + * @return mixed + */ + function findLast($predicate) {} + + /** + * Returns the first element matching the given predicate. + * + * @param callable $predicate[optional] ($value, $key) -> bool + * @return mixed + */ + function first($predicate) {} + + /** + * Returns a collection of all elements yielded from results of transform function + * being invoked on each element of original collection. + * + * @param callable $transform ($value, $key) -> array|Collection + * @return Collection + */ + function flatMap($transform) {} + + /** + * Appends all elements yielded from results of transform function being invoked on each element of + * original collection, to the given destination. + * + * @param Collection $destination + * @param callable $transform ($value, $key) -> array|Collection + * @return Collection + */ + function flatMapTo($destination, $transform) {} + + /** + * Returns a single list of all elements from all collections in the given collection. + * + * @return Collection + */ + function flatten() {} + + /** + * Accumulates value starting with initial value and applying operation from left to + * right to current accumulator value and each element. + * + * @param mixed $initial + * @param callable $operation ($acc, $value, $key) -> $new_acc + * @return mixed + */ + function fold($initial, $operation) {} + + /** + * Accumulates value starting with initial value and applying operation from right to + * left to each element and current accumulator value. + * + * @param mixed $initial + * @param callable $operation ($acc, $value, $key) -> $new_acc + * @return mixed + */ + function foldRight($initial, $operation) {} + + /** + * Performs the given action on each element. + * + * @param callable $action ($value, $key) -> void + * @return void + */ + function forEach($action) {} + + /** + * Returns an element at the given key or the result of calling the `default` function + * if the index is out of bounds of this array. + * + * @param int|string $key + * @param callable $default[optional] ($key) -> $value + * @return Collection + */ + function get($key, $default) {} + + /** + * Groups values returned by the value_transform function applied to each element of the + * original array by the key returned by the given key_selector function applied to the element + * and returns a collection where each group key is associated with a list of corresponding values. + * + * @param callable $key_selector ($value, $key) -> $new_key + * @param callable $value_transform[optional] ($value) -> $new_value + * @return Collection + */ + function groupBy($key_selector, $value_transform) {} + + /** + * Groups values returned by the value_transform function applied to each element of the original + * collection by the key returned by the given key_selector function applied to the element and + * puts to the destination collection each group key associated with a list of corresponding values. + * + * @param Collection $destination + * @param callable $key_selector ($value, $key) -> $new_key + * @param callable $value_transform[optional] ($value) -> $new_value + * @return Collection + */ + function groupByTo($destination, $key_selector, $value_transform) {} + + /** + * Returns first key of element, or null if the array does not contain element. + * + * @param mixed $element + * @return int|string|null + */ + function indexOf($element) {} + + /** + * Returns key of the first element matching the given predicate, or null if the array does + * not contain such element. + * + * @param callable $predicate ($value) -> bool + * @return int|string|null + */ + function indexOfFirst($predicate) {} + + /** + * Returns key of the last element matching the given predicate, or null if the array does + * not contain such element. + * + * @param callable $predicate ($value) -> bool + * @return int|string|null + */ + function indexOfLast($predicate) {} + + /** + * Initialize collection with given data. + * + * @param array $data[$optional] + * @return Collection + */ + static function init($data) {} + + /** + * Returns a collection containing all elements that are contained by both this collection and the + * specified collection. + * + * @param array|Collection $other + */ + function intersect($other) {} + + /** + * Returns true if the array is empty. + * + * @return bool + */ + function isEmpty() {} + + /** + * Returns true if the array is not empty. + */ + function isNotEmpty() {} + + /** + * Returns the last element matching the given predicate. + * + * @param callable $predicate[optional] ($value, $key) -> bool + * @return mixed + */ + function last($predicate) {} + + /** + * Returns last key of element, or null if the array does not contain element. + * + * @param mixed $element + * @return int|string|null + */ + function lastIndexOf($element) {} + + /** + * Returns a collection containing the results of applying the given transform function + * to each element in the original collection. + * + * @param callable $transform ($value, $key) -> $new_value + * @return Collection + */ + function map($transform) {} + + /** + * Returns a new collection with entries having the keys obtained by applying the transform function + * to each keys and values of this collection. + * + * @param callable $transform ($value, $key) -> $new_key + * @return Collection + */ + function mapKeys($transform) {} + + /** + * Populates the given destination collection with entries having the keys obtained by applying the + * transform function to each keys and values of this collections. + * + * @param Collection $destination + * @param callable $transform ($value, $key) -> $new_key + * @return Collection + */ + function mapKeysTo($destination, $transform) {} + + /** + * Applies the given transform function to each element of the original collection and appends the + * results to the given destination. + * + * @param Collection $destination + * @param callable $transform ($value, $key) -> $new_value + * @return Collection + */ + function mapTo($destination, $transform) {} + + /** + * Returns a new collection with entries having the keys of this collection and the values obtained + * by applying the transform function to each entry in this collection. + * + * @param callable $transform ($value, $key) -> $new_value + * @return Collection + */ + function mapValues($transform) {} + + /** + * Populates the given destination collection with entries having the keys of this collection and + * the values obtained by applying the transform function to each entry in this collection. + * + * @param Collection $destination + * @param callable $transform ($value, $key) -> $new_value + * @return Collection + */ + function mapValuesTo($destination, $transform) {} + + /** + * Returns the largest element or null if there are no elements. + * + * @return mixed + */ + function max() {} + + /** + * Returns the first element yielding the largest value of the given function or null if + * there are no elements. + * + * @param callable $selector ($value, $key) -> $new_value + * @return mixed + */ + function maxBy($selector) {} + + /** + * Returns the first element having the largest value according to the provided comparator or + * null if there are no elements. + * + * @param callable $comparator ($value_1, $value_2, $key_1, $key_2) -> int + * @return mixed + */ + function maxWith($comparator) {} + + /** + * Returns the largest element or null if there are no elements. + * + * @return mixed + */ + function min() {} + + /** + * Returns the first element yielding the smallest value of the given function or null if + * there are no elements. + * + * @param callable $selector ($value, $key) -> $new_value + * @return mixed + */ + function minBy($selector) {} + + /** + * Returns the first element having the smallest value according to the provided comparator or + * null if there are no elements. + * + * @param callable $comparator ($value_1, $value_2, $key_1, $key_2) -> int + * @return mixed + */ + function minWith($comparator) {} + + /** + * Returns a list containing all key-value pairs of the original collection except the ones contained + * in the given elements collection. + * + * @param array|Collection $elements + * @return Collection + */ + function minus($elements) {} + + /** + * Removes all key-value pairs contained in the given collection from this collection. + * + * @param array|Collection $elements + * @return void + */ + function minusAssign($elements) {} + + /** + * Returns a collection containing all entries of the original collection except those entries + * the keys of which are contained in the given keys collection. + * + * @param array|Collection $keys + * @return Collection + */ + function minusKeys($keys) {} + + /** + * Removes all entries the keys of which are contained in the given keys collection from this + * collection. + * + * @param array|Collection $keys + * @return void + */ + function minusKeysAssign($keys) {} + + /** + * Returns a list containing all elements of the original collection except the elements contained + * in the given elements collection. + * + * @param array|Collection $elements + * @return Collection + */ + function minusValues($elements) {} + + /** + * Removes all elements contained in the given elements collection from this collection. + * + * @param array|Collection $elements + * @return void + */ + function minusValuesAssign($elements) {} + + /** + * Returns true if no elements match the given predicate. + * + * @param callable $predicate ($value, $key) -> bool + * @return bool + */ + function none($predicate) {} + + /** + * @internal + */ + function offsetUnset($offset) {} + + /** + * @internal + */ + function offsetSet($offset, $value) {} + + /** + * @internal + */ + function offsetGet($offset) {} + + /** + * @internal + */ + function offsetExists($offset) {} + + /** + * Performs the given action on each element and returns the collection itself afterwards. + * + * @param callable $action ($value, $key) -> void + * @return Collection + */ + function onEach($action) {} + + /** + * Returns this collection if it's not null and the empty collection otherwise. + * + * @return Collection + */ + function orEmpty() {} + + /** + * Splits the original collection into pair of collections, where first collection contains + * elements for which predicate yielded true, while second collection contains elements for + * which predicate yielded false. + * + * @param callable $predicate ($value, $key) -> bool + * @return Pair + */ + function partition($predicate) {} + + /** + * Creates a new collection by replacing or adding entries to this collection from a given + * collection of key-value pairs. + * + * @param array|Collection $elements + * @return Collection + */ + function plus($elements) {} + + /** + * Appends or replaces all pairs from the given collection of pairs in this collection. + * + * @param array|Collection $elements + * @return void + */ + function plusAssign($elements) {} + + /** + * Returns a collection containing all elements of the original collection and then all elements + * of the given elements collection. + * + * @param array|Collection $elements + * @return Collection + */ + function plusValues($elements) {} + + /** + * Adds all elements of the given elements collection to this collection. + * + * @param array|Collection $elements + * @return void + */ + function plusValuesAssign($elements) {} + + /** + * Puts all the elements of the given collection into this collection. + * + * @param array|Collection $elements + * @return void + */ + function putAll($elements) {} + + /** + * Accumulates value starting with the first element and applying operation from left to right to + * current accumulator value and each element. + * + * @param $operation ($acc, $value, $key) -> $new_acc + * @return mixed + */ + function reduce($operation) {} + + /** + * Accumulates value starting with the last element and applying operation from right to left to + * each element and current accumulator value. + * + * @param $operation ($acc, $value, $key) -> $new_acc + * @return mixed + */ + function reduceRight($operation) {} + + /** + * Removes the entry for the specified key only if it is currently mapped to the specified value. + * + * @param int|string $key + * @param mixed $value[optional] + */ + function remove($key, $value) {} + + /** + * Removes all elements from this collection that match the given predicate. + * + * @param callable $predicate ($value, $key) -> bool + * @return bool + */ + function removeAll($predicate) {} + + /** + * Retains only elements of this collection that match the given predicate. + * + * @param callable $predicate ($value, $key) -> bool + * @return bool + */ + function retainAll($predicate) {} + + /** + * Reverses elements in the collection in-place. + * + * @return void + */ + function reverse() {} + + /** + * Returns a collection with elements in reversed order. + * + * @return Collection + */ + function reversed() {} + + /** + * Randomly shuffles elements in this collection. + * + * @return Collection + */ + function shuffle() {} + + /** + * Returns the single element matching the given predicate, or null if there is no or more than + * one matching element. + * + * @param callable $predicate ($value, $key) -> bool + * @return mixed + */ + function single($predicate) {} + + /** + * Returns a list containing elements at specified indices. + * + * @param array|Collection $indices + */ + function slice($indices) {} + + /** + * Sorts the collection in-place according to the natural order of its elements. + * + * @return void + */ + function sort() {} + + /** + * Sorts elements in the collection in-place according to natural sort order of the value returned + * by specified selector function. + * + * @param callable $selector ($value, $key) -> $new_value + * @return void + */ + function sortBy($selector) {} + + /** + * Sorts elements in the collection in-place descending according to natural sort order of the + * value returned by specified selector function. + * + * @param callable $selector ($value, $key) -> $new_value + * @return void + */ + function sortByDescending($selector) {} + + /** + * Sorts elements in the collection in-place descending according to their natural sort order. + * + * @return void + */ + function sortDescending() {} + + /** + * Sorts elements in the collection in-place according to the order specified with comparator. + * + * @param callable $comparator ($value_1, $value_2, $key_1, $key_2) -> int + * @return void + */ + function sortWith($comparator) {} + + /** + * Returns a collection of all elements sorted according to their natural sort order. + * + * @return Collection + */ + function sorted() {} + + /** + * Returns a collection of all elements sorted according to natural sort order of the + * value returned by specified selector function. + * + * @param callable $selector ($value, $key) -> $new_value + * @return Collection + */ + function sortedBy($selector) {} + + /** + * Returns a collection of all elements sorted descending according to natural sort order + * of the value returned by specified selector function. + * + * @param callable $selector ($value, $key) -> $new_value + * @return Collection + */ + function sortedByDescending($selector) {} + + /** + * Returns a collection of all elements sorted descending according to their natural sort order. + * + * @param callable $selector ($value, $key) -> $new_value + * @return Collection + */ + function sortedDescending($selector) {} + + /** + * Returns a collection of all elements sorted according to the specified comparator. + * + * @param callable $comparator ($value_1, $value_2, $key_1, $key_2) -> int + * @return Collection + */ + function sortedWith($comparator) {} + + /** + * Returns a collection containing first n elements. + * + * @param int $n + * @return Collection + */ + function take($n) {} + + /** + * Returns a list containing last n elements. + * + * @param int $n + * @return Collection + */ + function takeLast($n) {} + + /** + * Returns a collection containing last elements satisfying the given predicate. + * + * @param $predicate ($value, $key) -> bool + * @return Collection + */ + function takeLastWhile($predicate) {} + + /** + * Returns a collection containing first elements satisfying the given predicate. + * + * @param $predicate ($value, $key) -> bool + * @return Collection + */ + function takeWhile($predicate) {} + + /** + * Returns the array wrapped by this collection. + * + * @return array + */ + function toArray() {} + + /** + * Appends all elements to the given destination collection. + * + * @param Collection $destination + * @return Collection + */ + function toCollection($destination) {} + + /** + * Convert collection to a collection of pairs with keys being first and values being second. + * + * @return Collection + */ + function toPairs() {} + + /** + * Returns a collection containing all distinct elements from both collections. + * + * @param array|Collection $other + */ + function union($other) {} +} \ No newline at end of file diff --git a/stubs/Pair.php b/stubs/Pair.php new file mode 100644 index 0000000..7ffb5ab --- /dev/null +++ b/stubs/Pair.php @@ -0,0 +1,19 @@ +