vendor/shopware/core/Framework/Struct/Collection.php line 38

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Shopware\Core\Framework\Struct;
  3. /**
  4.  * @template TElement
  5.  */
  6. abstract class Collection extends Struct implements \IteratorAggregate, \Countable
  7. {
  8.     /**
  9.      * @var array<TElement>
  10.      */
  11.     protected $elements = [];
  12.     /**
  13.      * @param array<TElement> $elements
  14.      */
  15.     public function __construct(iterable $elements = [])
  16.     {
  17.         foreach ($elements as $key => $element) {
  18.             $this->set($key$element);
  19.         }
  20.     }
  21.     /**
  22.      * @param TElement $element
  23.      */
  24.     public function add($element): void
  25.     {
  26.         $this->validateType($element);
  27.         $this->elements[] = $element;
  28.     }
  29.     /**
  30.      * @param TElement $element
  31.      */
  32.     public function set($key$element): void
  33.     {
  34.         $this->validateType($element);
  35.         if ($key === null) {
  36.             $this->elements[] = $element;
  37.         } else {
  38.             $this->elements[$key] = $element;
  39.         }
  40.     }
  41.     /**
  42.      * @param mixed|null $key
  43.      *
  44.      * @return TElement|null
  45.      */
  46.     public function get($key)
  47.     {
  48.         if ($this->has($key)) {
  49.             return $this->elements[$key];
  50.         }
  51.         return null;
  52.     }
  53.     public function clear(): void
  54.     {
  55.         $this->elements = [];
  56.     }
  57.     public function count(): int
  58.     {
  59.         return \count($this->elements);
  60.     }
  61.     public function getKeys(): array
  62.     {
  63.         return array_keys($this->elements);
  64.     }
  65.     public function has($key): bool
  66.     {
  67.         return \array_key_exists($key$this->elements);
  68.     }
  69.     public function map(\Closure $closure): array
  70.     {
  71.         return array_map($closure$this->elements);
  72.     }
  73.     public function reduce(\Closure $closure$initial null)
  74.     {
  75.         return array_reduce($this->elements$closure$initial);
  76.     }
  77.     public function fmap(\Closure $closure): array
  78.     {
  79.         return array_filter($this->map($closure));
  80.     }
  81.     public function sort(\Closure $closure): void
  82.     {
  83.         uasort($this->elements$closure);
  84.     }
  85.     /**
  86.      * @return static
  87.      */
  88.     public function filterInstance(string $class)
  89.     {
  90.         return $this->filter(static function ($item) use ($class) {
  91.             return $item instanceof $class;
  92.         });
  93.     }
  94.     /**
  95.      * @return static
  96.      */
  97.     public function filter(\Closure $closure)
  98.     {
  99.         return $this->createNew(array_filter($this->elements$closure));
  100.     }
  101.     /**
  102.      * @return static
  103.      */
  104.     public function slice(int $offset, ?int $length null)
  105.     {
  106.         return $this->createNew(\array_slice($this->elements$offset$lengthtrue));
  107.     }
  108.     /**
  109.      * @return array<TElement>
  110.      */
  111.     public function getElements(): array
  112.     {
  113.         return $this->elements;
  114.     }
  115.     /**
  116.      * @return list<TElement>
  117.      */
  118.     public function jsonSerialize(): array
  119.     {
  120.         return array_values($this->elements);
  121.     }
  122.     /**
  123.      * @return ($this->elements is non-empty-array ? TElement : null)
  124.      */
  125.     public function first()
  126.     {
  127.         return array_values($this->elements)[0] ?? null;
  128.     }
  129.     /**
  130.      * @return TElement|null
  131.      */
  132.     public function getAt(int $position)
  133.     {
  134.         return array_values($this->elements)[$position] ?? null;
  135.     }
  136.     /**
  137.      * @return ($this->elements is non-empty-array ? TElement : null)
  138.      */
  139.     public function last()
  140.     {
  141.         return array_values($this->elements)[\count($this->elements) - 1] ?? null;
  142.     }
  143.     /**
  144.      * @param int|string $key
  145.      */
  146.     public function remove($key): void
  147.     {
  148.         unset($this->elements[$key]);
  149.     }
  150.     /**
  151.      * @deprecated tag:v6.5.0 - reason:return-type-change - Return type will be changed to \Traversable
  152.      *
  153.      * @return \Generator<TElement>
  154.      */
  155.     #[\ReturnTypeWillChange]
  156.     public function getIterator(): \Generator/* :\Traversable */
  157.     {
  158.         yield from $this->elements;
  159.     }
  160.     /**
  161.      * @return class-string<TElement>|null
  162.      */
  163.     protected function getExpectedClass(): ?string
  164.     {
  165.         return null;
  166.     }
  167.     /**
  168.      * @return static
  169.      */
  170.     protected function createNew(iterable $elements = [])
  171.     {
  172.         return new static($elements);
  173.     }
  174.     protected function validateType($element): void
  175.     {
  176.         $expectedClass $this->getExpectedClass();
  177.         if ($expectedClass === null) {
  178.             return;
  179.         }
  180.         if (!$element instanceof $expectedClass) {
  181.             $elementClass = \get_class($element);
  182.             throw new \InvalidArgumentException(
  183.                 sprintf('Expected collection element of type %s got %s'$expectedClass$elementClass)
  184.             );
  185.         }
  186.     }
  187. }