| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 |
- <?php
- /**
- * This file is part of the ramsey/collection library
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright Copyright (c) Ben Ramsey <ben@benramsey.com>
- * @license http://opensource.org/licenses/MIT MIT
- */
- declare(strict_types=1);
- namespace Ramsey\Collection;
- use Ramsey\Collection\Exception\CollectionMismatchException;
- use Ramsey\Collection\Exception\InvalidArgumentException;
- use Ramsey\Collection\Exception\InvalidPropertyOrMethod;
- use Ramsey\Collection\Exception\NoSuchElementException;
- use Ramsey\Collection\Exception\UnsupportedOperationException;
- /**
- * A collection represents a group of values, known as its elements.
- *
- * Some collections allow duplicate elements and others do not. Some are ordered
- * and others unordered.
- *
- * @template T
- * @extends ArrayInterface<T>
- */
- interface CollectionInterface extends ArrayInterface
- {
- /**
- * Ensures that this collection contains the specified element (optional
- * operation).
- *
- * Returns `true` if this collection changed as a result of the call.
- * (Returns `false` if this collection does not permit duplicates and
- * already contains the specified element.)
- *
- * Collections that support this operation may place limitations on what
- * elements may be added to this collection. In particular, some
- * collections will refuse to add `null` elements, and others will impose
- * restrictions on the type of elements that may be added. Collection
- * classes should clearly specify in their documentation any restrictions
- * on what elements may be added.
- *
- * If a collection refuses to add a particular element for any reason other
- * than that it already contains the element, it must throw an exception
- * (rather than returning `false`). This preserves the invariant that a
- * collection always contains the specified element after this call returns.
- *
- * @param T $element The element to add to the collection.
- *
- * @return bool `true` if this collection changed as a result of the call.
- *
- * @throws InvalidArgumentException if the collection refuses to add the
- * $element for any reason other than that it already contains the element.
- */
- public function add(mixed $element): bool;
- /**
- * Returns `true` if this collection contains the specified element.
- *
- * @param T $element The element to check whether the collection contains.
- * @param bool $strict Whether to perform a strict type check on the value.
- */
- public function contains(mixed $element, bool $strict = true): bool;
- /**
- * Returns the type associated with this collection.
- */
- public function getType(): string;
- /**
- * Removes a single instance of the specified element from this collection,
- * if it is present.
- *
- * @param T $element The element to remove from the collection.
- *
- * @return bool `true` if an element was removed as a result of this call.
- */
- public function remove(mixed $element): bool;
- /**
- * Returns the values from the given property, method, or array key.
- *
- * @param string $propertyOrMethod The name of the property, method, or
- * array key to evaluate and return.
- *
- * @return array<int, mixed>
- *
- * @throws InvalidPropertyOrMethod if the $propertyOrMethod does not exist
- * on the elements in this collection.
- * @throws UnsupportedOperationException if unable to call column() on this
- * collection.
- */
- public function column(string $propertyOrMethod): array;
- /**
- * Returns the first item of the collection.
- *
- * @return T
- *
- * @throws NoSuchElementException if this collection is empty.
- */
- public function first(): mixed;
- /**
- * Returns the last item of the collection.
- *
- * @return T
- *
- * @throws NoSuchElementException if this collection is empty.
- */
- public function last(): mixed;
- /**
- * Sort the collection by a property, method, or array key with the given
- * sort order.
- *
- * If $propertyOrMethod is `null`, this will sort by comparing each element.
- *
- * This will always leave the original collection untouched and will return
- * a new one.
- *
- * @param string | null $propertyOrMethod The property, method, or array key
- * to sort by.
- * @param Sort $order The sort order for the resulting collection.
- *
- * @return CollectionInterface<T>
- *
- * @throws InvalidPropertyOrMethod if the $propertyOrMethod does not exist
- * on the elements in this collection.
- * @throws UnsupportedOperationException if unable to call sort() on this
- * collection.
- */
- public function sort(?string $propertyOrMethod = null, Sort $order = Sort::Ascending): self;
- /**
- * Filter out items of the collection which don't match the criteria of
- * given callback.
- *
- * This will always leave the original collection untouched and will return
- * a new one.
- *
- * See the {@link http://php.net/manual/en/function.array-filter.php PHP array_filter() documentation}
- * for examples of how the `$callback` parameter works.
- *
- * @param callable(T): bool $callback A callable to use for filtering elements.
- *
- * @return CollectionInterface<T>
- */
- public function filter(callable $callback): self;
- /**
- * Create a new collection where the result of the given property, method,
- * or array key of each item in the collection equals the given value.
- *
- * This will always leave the original collection untouched and will return
- * a new one.
- *
- * @param string | null $propertyOrMethod The property, method, or array key
- * to evaluate. If `null`, the element itself is compared to $value.
- * @param mixed $value The value to match.
- *
- * @return CollectionInterface<T>
- *
- * @throws InvalidPropertyOrMethod if the $propertyOrMethod does not exist
- * on the elements in this collection.
- * @throws UnsupportedOperationException if unable to call where() on this
- * collection.
- */
- public function where(?string $propertyOrMethod, mixed $value): self;
- /**
- * Apply a given callback method on each item of the collection.
- *
- * This will always leave the original collection untouched. The new
- * collection is created by mapping the callback to each item of the
- * original collection.
- *
- * See the {@link http://php.net/manual/en/function.array-map.php PHP array_map() documentation}
- * for examples of how the `$callback` parameter works.
- *
- * @param callable(T): TCallbackReturn $callback A callable to apply to each
- * item of the collection.
- *
- * @return CollectionInterface<TCallbackReturn>
- *
- * @template TCallbackReturn
- */
- public function map(callable $callback): self;
- /**
- * Apply a given callback method on each item of the collection
- * to reduce it to a single value.
- *
- * See the {@link http://php.net/manual/en/function.array-reduce.php PHP array_reduce() documentation}
- * for examples of how the `$callback` and `$initial` parameters work.
- *
- * @param callable(TCarry, T): TCarry $callback A callable to apply to each
- * item of the collection to reduce it to a single value.
- * @param TCarry $initial This is the initial value provided to the callback.
- *
- * @return TCarry
- *
- * @template TCarry
- */
- public function reduce(callable $callback, mixed $initial): mixed;
- /**
- * Create a new collection with divergent items between current and given
- * collection.
- *
- * @param CollectionInterface<T> $other The collection to check for divergent
- * items.
- *
- * @return CollectionInterface<T>
- *
- * @throws CollectionMismatchException if the compared collections are of
- * differing types.
- */
- public function diff(CollectionInterface $other): self;
- /**
- * Create a new collection with intersecting item between current and given
- * collection.
- *
- * @param CollectionInterface<T> $other The collection to check for
- * intersecting items.
- *
- * @return CollectionInterface<T>
- *
- * @throws CollectionMismatchException if the compared collections are of
- * differing types.
- */
- public function intersect(CollectionInterface $other): self;
- /**
- * Merge current items and items of given collections into a new one.
- *
- * @param CollectionInterface<T> ...$collections The collections to merge.
- *
- * @return CollectionInterface<T>
- *
- * @throws CollectionMismatchException if unable to merge any of the given
- * collections or items within the given collections due to type
- * mismatch errors.
- */
- public function merge(CollectionInterface ...$collections): self;
- }
|