src/PHPCoverFish/Common/ArrayCollection.php
<?php namespace DF\PHPCoverFish\Common; use ArrayIterator;use Closure; /** * ArrayCollection helper, based on the work on \Doctrine\Common\ArrayCollection of Benjamin Eberlei <kontakt@beberlei.de>, * Jonathan Wage <jonwage@gmail.com> and Roman Borschel <roman@code-factory.org>. minor changes and improvements by Patrick Paechnatz * * core: * * @since 2.0 * @author Guilherme Blanco <guilhermeblanco@hotmail.com> * @author Jonathan Wage <jonwage@gmail.com> * @author Roman Borschel <roman@code-factory.org> * * changes/improvements: * * @author Patrick Paechnatz <patrick.paechnatz@gmail.com> */`ArrayCollection` has 32 functions (exceeds 20 allowed). Consider refactoring.class ArrayCollection implements Collection{ /** * An array containing the entries of this collection. * * @var array */ private $elements; /** * Initializes a new ArrayCollection. * * @param array $elements * * @codeCoverageIgnore */ public function __construct(array $elements = array()) { $this->elements = $elements; } /** * {@inheritDoc} */ public function toArray() { return $this->elements; } /** * {@inheritDoc} */ public function first() { return reset($this->elements); } /** * {@inheritDoc} */ public function last() { return end($this->elements); } /** * {@inheritDoc} */ public function key() { return key($this->elements); } /** * {@inheritDoc} */ public function next() { return next($this->elements); } /** * {@inheritDoc} */ public function current() { return current($this->elements); } /** * {@inheritDoc} */ public function remove($key) { if (!isset($this->elements[$key]) && !array_key_exists($key, $this->elements)) { return null; } $removed = $this->elements[$key]; unset($this->elements[$key]); return $removed; } /** * {@inheritDoc} */ public function removeElement($element) { $key = array_search($element, $this->elements, true); if ($key === false) { return false; } unset($this->elements[$key]); return true; } /** * Required by interface ArrayAccess. * * {@inheritDoc} */ public function offsetExists($offset) { return $this->containsKey($offset); } /** * Required by interface ArrayAccess. * * {@inheritDoc} */ public function offsetGet($offset) { return $this->get($offset); } /** * Required by interface ArrayAccess. * * {@inheritDoc} */ public function offsetSet($offset, $value) { if (!isset($offset)) { return $this->add($value); } $this->set($offset, $value); return null; } /** * Required by interface ArrayAccess. * * {@inheritDoc} */ public function offsetUnset($offset) { return $this->remove($offset); } /** * {@inheritDoc} */ public function containsKey($key) { return isset($this->elements[$key]) || array_key_exists($key, $this->elements); } /** * {@inheritDoc} */ public function contains($element) { return in_array($element, $this->elements, true); } /** * Tests for the existence of an element that satisfies the given predicate. * * @param Closure $p The predicate. * @return boolean TRUE if the predicate is TRUE for at least one element, FALSE otherwise. */ public function exists(Closure $p) { foreach ($this->elements as $key => $element) { if ($p($key, $element)) { return true; } } return false; } /** * Applies the given predicate p to all elements of this collection, * returning true, if the predicate yields true for all elements. * * @param Closure $p The predicate. * @return boolean TRUE, if the predicate yields TRUE for all elements, FALSE otherwise. */ public function forAll(Closure $p) { return $this->exists($p); } /** * {@inheritDoc} */ public function indexOf($element) { return array_search($element, $this->elements, true); } /** * {@inheritDoc} */ public function get($key) { return isset($this->elements[$key]) ? $this->elements[$key] : null; } /** * {@inheritDoc} */ public function getKeys() { return array_keys($this->elements); } /** * {@inheritDoc} */ public function getValues() { return array_values($this->elements); } /** * {@inheritDoc} */ public function count() { return count($this->elements); } /** * {@inheritDoc} */ public function set($key, $value) { $this->elements[$key] = $value; } /** * {@inheritDoc} */ public function add($value) { $this->elements[] = $value; return true; } /** * {@inheritDoc} */ public function isEmpty() { return empty($this->elements); } /** * Required by interface IteratorAggregate. * * {@inheritDoc} */ public function getIterator() { return new ArrayIterator($this->elements); } /** * {@inheritDoc} */ public function map(Closure $func) { return new static(array_map($func, $this->elements)); } /** * {@inheritDoc} */ public function filter(Closure $p) { return new static(array_filter($this->elements, $p)); } /** * {@inheritDoc} */ public function partition(Closure $p) { $matches = $noMatches = array(); foreach ($this->elements as $key => $element) { if ($p($key, $element)) { $matches[$key] = $element; } else { $noMatches[$key] = $element; } } return array(new static($matches), new static($noMatches)); } /** * Returns a string representation of this object. * * @return string */ public function __toString() { return sprintf('%s@%s', __CLASS__, spl_object_hash($this)); } /** * {@inheritDoc} */ public function clear() { $this->elements = array(); } /** * {@inheritDoc} */ public function slice($offset, $length = null) { return array_slice($this->elements, $offset, $length, true); }}