protected function fallbackForArray(&$data): array
    {
        if (\is_array($data)) {
            return $data;
        }

        if (!$data) {
            return [];
        }

        $isObject = \is_object($data);

        if ($isObject && $data instanceof self) {
            return $data->getArray();
        }

        if ($isObject && $data instanceof \ArrayObject) {
            return $data->getArrayCopy();
        }

        if ($isObject && $data instanceof \Generator) {
            return static::createFromGeneratorImmutable($data)->getArray();
        }

        if ($isObject && $data instanceof \Traversable) {
            return static::createFromObject($data)->getArray();
        }

        if (\is_callable($data)) {
            $this->generator = new ArrayyRewindableGenerator($data);

            return [];
        }

        if ($isObject && \method_exists($data, '__toArray')) {
            return (array) $data->__toArray();
        }

        if (
            \is_string($data)
            ||
            ($isObject && \method_exists($data, '__toString'))
        ) {
            return [(string) $data];
        }

        throw new \InvalidArgumentException(
            'Passed value should be a array'
        );
    }