<?php

namespace goodboyalex\php_components_pack\traits\ObjectArray;

use goodboyalex\php_components_pack\classes\ObjectArray;

/**
 * Часть кода класса ObjectArray, отвечающая за специальные функции.
 *
 * @author Александр Бабаев
 * @package php_components_pack
 * @version 1.0
 * @since 1.0
 */
trait ObjectArraySpecialTrait
{
    /**
     * Очищает массив объектов, хранящийся в данном классе.
     *
     * @return void
     */
    public function Clear (): void
    {
        // Очищаем массив
        unset($this->Container);

        // Создаем новый массив
        $this->Container = [];
    }

    /**
     * Добавляет объект в массив объектов, хранящийся в данном классе (аналогично добавлению элемента в массив с
     * помощью []).
     *
     * @param mixed $object Объект, который будет добавлен в массив объектов, хранящийся в данном классе.
     *
     * @return void
     */
    public function Add (mixed $object): void
    {
        $this->Container[] = $object;
    }

    /**
     * Добавляет массив объектов (или объекты, заданные с помощью array) в массив объектов, хранящийся в данном классе.
     *
     * @param ObjectArray|array $objects Массив объектов, которые будут добавлены в массив объектов.
     *
     * @return void
     */
    public function AddRange (ObjectArray|array $objects): void
    {
        // Если передан массив, то не изменяем его, а если передан объект класса ObjectArray, то конвертируем его в массив объектов
        $objectsToAdd = is_array($objects) ? $objects : $objects->ToArray();

        // Добавляем массив объектов
        $this->Merge($objectsToAdd);
    }

    /**
     * Возвращает массив объектов, хранящихся в данном классе.
     *
     * @return array Массив объектов, хранящихся в данном классе.
     */
    public function ToArray (): array
    {
        return $this->Container;
    }

    /**
     * Объединяет массив объектов, хранящийся в данном классе, с массивом объектов, переданным в качестве параметра.
     *
     * @param array $objects Массив объектов, который будет объединен с массивом объектов, хранящимся в данном классе.
     *
     * @return void
     */
    public function Merge (array $objects): void
    {
        $this->Container = array_merge($this->Container, $objects);
    }
}