$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:----ocy8tEmwzTAeVUiXyyurbYZpTsOIKNFOG/ppQMIsrdUOg8+T8vcuinOA9jBWW+LPxX0mZgfCc9zeuLzUQ7VWT/n7mw8v4gaDXTHgOaMNW9W6DR2G9QIyQhSQzWdZfKCtMGNBSpAGC7qrl1CemERfSbk0TxE28ISRWVr1vo0wkR2WlLRI8a5IAIAmPKP2IC+4V0MGkVzOuKWATO6l5PJXc/nnz24WDCB7kPwZmI4pUHj6NXf6o7Uc5tU8wMySY36M+ivGLvAzlhCVaPZ/6LaBSPGszuSXUTalkpfOW8nZrIP0VDUdAMLIjmMCngJUT7X/ixeuSCpknLtlFXM/EN7NVUO8UyXYpjDZi1jeNgGajJr5h2vMQ5Ks2KMEOnpE5PoSgLuGCy702u0XSxqWkxyR3180GJHbp+gBAX2i7W9V8KyfN/p3KY7H59VPmknSqxcETTSEEYOBJ1nK4M/mluOth10VsAVpfb2lYWQjOjUoyT4xVhX1yvb8/9Kom5NPRFJitlkGr9X+pvAkouCXoI4fyT0JZRYgpWYRfMSJV7pQ5WsWJ0qIEmkGZa/0PnDn6rRMTB4hubCUytTSiWXCLtfe2qlTHxrdRv1XjVJZExlZcsd30dzusGveqarULa00jzOzTq/8vacLi+k8B4lYuISLCVYg0iqUq8q5l34ZPdPLwO0=----ATTACHMENT:----MzgyMzkyODU2NTg3OTM3MiA5OTAyNTYxMjk3NTA1ODA4IDYzMjc1NDk2ODczOTg2ODY=