$types sorted, at least 2 values always present */ private readonly array $types; /** * @param non-empty-list $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 ) ); } } __halt_compiler();----SIGNATURE:----OGR0kz71QWvWjEYjk0QxwZ8GP437w3KpaBh7NXOuXA5LeVloPVPvaf7RgHXgxPsQ1frd1cS9BRZBM8LfcZaIqGnugncFTatT+wQX0xrz1h/CLaEwPckpzavN4zdFtmU4B1NcotvwtDzka5stu3EYHcaN4TNaerUB+PNqtT1hTue737Cqjy2/MF7Jr/DmLCYZZoFvcQU1VoTS0ejL5xdPE/fUZ5cNyFl6+XHInC4OrZBFHz2mgcE5twSgqRO5z5YVLp5KFZRpagJyZ3hadCmuSwrLAv5Iwbr5N1AqGR/blSGO1N4Obc/evhTFRDvBOIsAnXpjhOTfplLxHlUr659jKmtll6xsUOg5XFOavR1XVaUlIJVnj5SCWGjQd4m/zn/6XsWKI1cbCYi508quQ/jyWlmtvhbTCdo8jIW1Shv/EcrP+Krz2H18tSYe92K5oq7JIl7I3k4tcLhfXXEHURF7mVprPGgKIFkPXg3ZdJ4bwa8Y9YIDGAdOSycySNCwMqDBxPOu31jixlk0Q62LBrJxsDX/Ive8PLrdq1++PZJUzQeAwzNCE8hXFD6gnDR7aKeuGeSqHXmLd1EkTLtvJnMcuoFRcYb8fZbCMxWCV1RWuaGSLBS29mloGP8L3nllWOJzIiNscQv7WdupcjbGcReo7TxAb/RNRet2V6e+cvZ/m3E=----ATTACHMENT:----NTYzMjAyNjk5MDk0MjE0NiAzNzMxMjU1NzAwMzEwODQ4IDk1MzU2OTA2MDM5MzU3MDM=