*/ private array $elements = []; public function create(CreateElementDto $dto): Element { $id = count($this->elements) + 1; $element = new Element( id: $id, name: $dto->name, kind: $dto->kind, set: $dto->set, parentElement: $dto->parentElement, position: $this->nextPosition($dto), ); $this->elements[$id] = $element; return $this->copy($element); } public function find(int $id): ?Element { $element = $this->elements[$id] ?? null; return $element === null ? null : $this->copy($element); } private function nextPosition(CreateElementDto $dto): int { $requestedParentId = $dto->parentElement?->getId(); $maximumPosition = 0; foreach ($this->elements as $element) { if ($element->getSet()->getId() !== $dto->set->getId()) { continue; } $elementParentId = $element->getParentElement()?->getId(); if ($elementParentId !== $requestedParentId) { continue; } $maximumPosition = max( $maximumPosition, $element->getPosition(), ); } return $maximumPosition + 1; } private function copy(Element $element): Element { $parentElement = $element->getParentElement(); return new Element( id: $element->getId(), name: $element->getName(), kind: $element->getKind(), set: $element->getSet(), parentElement: $parentElement === null ? null : $this->copy($parentElement), position: $element->getPosition(), ); } }