HEX
Server: LiteSpeed
System: Linux sv4.hami.host 5.14.0-611.54.3.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Thu May 7 16:31:24 EDT 2026 x86_64
User: armgroup (1008)
PHP: 8.2.32
Disabled: show_source, system, shell_exec, passthru, exec, popen, proc_open, mail, socket_create, socket_create_listen, socket_create_pair, link, dl, openlog, syslog, stream_socket_server, curl_multi_init
Upload Files
File: /home/armgroup/libs/vendor/laminas/laminas-code/src/Generator/TypeGenerator/UnionType.php
<?php

namespace Laminas\Code\Generator\TypeGenerator;

use function array_diff_key;
use function array_flip;
use function array_map;
use function implode;
use function usort;

/**
 * @internal the {@see UnionType} is an implementation detail of the type generator,
 *
 * @psalm-immutable
 */
final class UnionType
{
    /** @var non-empty-list<AtomicType|IntersectionType> $types sorted, at least 2 values always present */
    private readonly array $types;

    /** @param non-empty-list<AtomicType|IntersectionType> $types at least 2 values needed */
    public function __construct(array $types)
    {
        usort(
            $types,
            static fn(AtomicType|IntersectionType $a, AtomicType|IntersectionType $b): int => [
                $a instanceof IntersectionType ? -1 : $a->sortIndex,
                $a->toString(),
            ] <=> [
                $b instanceof IntersectionType ? -1 : $b->sortIndex,
                $b->toString(),
            ]
        );

        foreach ($types as $index => $type) {
            foreach (array_diff_key($types, array_flip([$index])) as $otherType) {
                $type->assertCanUnionWith($otherType);
            }
        }

        $this->types = $types;
    }

    /** @return non-empty-string */
    public function toString(): string
    {
        return implode(
            '|',
            array_map(
                static fn(AtomicType|IntersectionType $type): string => $type instanceof IntersectionType
                    ? '(' . $type->toString() . ')'
                    : $type->toString(),
                $this->types
            )
        );
    }

    /** @return non-empty-string */
    public function fullyQualifiedName(): string
    {
        return implode(
            '|',
            array_map(
                static fn(AtomicType|IntersectionType $type): string => $type instanceof IntersectionType
                    ? '(' . $type->fullyQualifiedName() . ')'
                    : $type->fullyQualifiedName(),
                $this->types
            )
        );
    }
}