From 6833b4a40e6511c6342f3379b2ca38466bf526c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miloslav=20H=C5=AFla?= Date: Mon, 9 Jan 2017 18:41:36 +0100 Subject: [PATCH] [WIP] Added Nette\Utils\Collection --- src/Utils/Collection.php | 204 +++++++++++++++++++++++++++++++++++++++ src/Utils/exceptions.php | 10 ++ 2 files changed, 214 insertions(+) create mode 100644 src/Utils/Collection.php diff --git a/src/Utils/Collection.php b/src/Utils/Collection.php new file mode 100644 index 000000000..af50616f0 --- /dev/null +++ b/src/Utils/Collection.php @@ -0,0 +1,204 @@ +add($item); + } + + return $me; + } + + + /** + * @return static + * @throws Nette\NotSupportedException + */ + public static function fromArray(array $items, array $constructorArgs = []) + { + return static::fromIterator(new \ArrayIterator($items), $constructorArgs); + } + + + /** + * @return int + */ + public function count() + { + return count($this->items); + } + + + /** + * @param mixed + * @return bool + */ + public function has($key) + { + return array_key_exists($this->normalizeKey($key), $this->items); + } + + + /** + * @return array + */ + public function getKeys() + { + return array_keys($this->items); + } + + + /** + * @return \ArrayIterator + */ + public function getIterator() + { + return new \ArrayIterator($this->items); + } + + + /** + * @param callable + * @return static + */ + public function filter(callable $cb) + { + $me = clone $this; + $me->items = array_filter($this->items, $cb, ARRAY_FILTER_USE_BOTH); + return $me; + } + + + /** + * @param callable + * @return static + */ + public function walk(callable $cb) + { + array_walk($this->items, $cb); + return $this; + } + + + /** + * @param callable + * @return array + */ + public function convert(callable $cb) + { + $result = []; + foreach ($this->items as $key => $item) { + $unset = FALSE; + $item = $cb($item, $key, $unset); + if (!$unset) { + if ($key === NULL) { + $result[] = $item; + } else { + $result[$key] = $item; + } + } + } + + return $result; + } + + + /** + * @param callable $cb + * @return static + */ + public function sortBy(callable $cb) + { + if ($this->keysMatter) { + uasort($this->items, $cb); + } else { + usort($this->items, $cb); + } + + return $this; + } + + + /** + * @param mixed $key + * @return int|string + */ + protected function normalizeKey($key) + { + return $key; + } + + + /** + * @param mixed + * @param mixed + * @throws Nette\ArgumentOutOfRangeException + * @return void + */ + protected function addItem($item, $key) + { + $key = $this->normalizeKey($key); + + if ($key === NULL) { + $this->items[] = $item; + } else { + if (array_key_exists($key, $this->items)) { + throw new Nette\ArgumentOutOfRangeException("Item with key '$key' already exists in " . get_class($this) . " collection."); + } + $this->items[$key] = $item; + $this->keysMatter = TRUE; + } + } + + + /** + * @param mixed + * @return mixed + * @throws ItemNotFoundException + */ + protected function getItem($key) + { + $key = $this->normalizeKey($key); + + if (!array_key_exists($key, $this->items)) { + throw new ItemNotFoundException("Item with key '$key' was not found in collection."); + } + + return $this->items[$key]; + } + +} diff --git a/src/Utils/exceptions.php b/src/Utils/exceptions.php index f7af9b4ef..c76dfdfb0 100644 --- a/src/Utils/exceptions.php +++ b/src/Utils/exceptions.php @@ -119,6 +119,8 @@ class StaticClassException extends \LogicException namespace Nette\Utils; +use Nette; + /** * The exception that is thrown when an image error occurs. @@ -158,3 +160,11 @@ class RegexpException extends \Exception class AssertionException extends \Exception { } + + +/** + * The exception indicates that item is not present in collection. + */ +class ItemNotFoundException extends Nette\ArgumentOutOfRangeException +{ +}