|DelimiterProcessorInterface[] * * @psalm-readonly-allow-private-mutation */ private array $processorsByChar = []; public function add(DelimiterProcessorInterface $processor): void { $opening = $processor->getOpeningCharacter(); $closing = $processor->getClosingCharacter(); if ($opening === $closing) { $old = $this->processorsByChar[$opening] ?? null; if ($old !== null && $old->getOpeningCharacter() === $old->getClosingCharacter()) { $this->addStaggeredDelimiterProcessorForChar($opening, $old, $processor); } else { $this->addDelimiterProcessorForChar($opening, $processor); } } else { $this->addDelimiterProcessorForChar($opening, $processor); $this->addDelimiterProcessorForChar($closing, $processor); } } public function getDelimiterProcessor(string $char): ?DelimiterProcessorInterface { return $this->processorsByChar[$char] ?? null; } /** * @return string[] */ public function getDelimiterCharacters(): array { return \array_keys($this->processorsByChar); } private function addDelimiterProcessorForChar(string $delimiterChar, DelimiterProcessorInterface $processor): void { if (isset($this->processorsByChar[$delimiterChar])) { throw new InvalidArgumentException(\sprintf('Delim processor for character "%s" already exists', $processor->getOpeningCharacter())); } $this->processorsByChar[$delimiterChar] = $processor; } private function addStaggeredDelimiterProcessorForChar( string $opening, DelimiterProcessorInterface $old, DelimiterProcessorInterface $new, ): void { if ($old instanceof StaggeredDelimiterProcessor) { $s = $old; } else { $s = new StaggeredDelimiterProcessor($opening, $old); } $s->add($new); $this->processorsByChar[$opening] = $s; } public function count(): int { return \count($this->processorsByChar); } } __halt_compiler();----SIGNATURE:----GZOBa5X4oSEjNvZIaMCVsF6vqT//IUpg5Shop2DscnvVQrGAlGQ/YTSBU9ta7GJJSV5zjiAsenXNdf3vDR5hL+L7Zn8tNAue12wpcbbZwJpGHANzqeXVVT4+8zZVXOBm0HG9g21kC6beTWuMFGaG4TRun0OVkz4iwERJZd4QpsIpaCd6Uk4MnuPmlsqa1lBtFaU9+as4PBb9wSB/rwoFY43R9iGwwb+PXwl69J6lZpsTsFEZmwn8HgKoqZsPCb9umQcoJBVvVHsupWIkyKbnhBtfoFKennUEPRTzxWSN36huU3Ey5iI/Te6hQd45fj6msK9u7GVLXt7lkIUSqcTHcSqJ9C0v3gNMKCieof33mPYHz7Nwl1Kqw1pQ8UD/kKqdpBEngYD0hzwbin6nsd4X1RtNF2AIiQBWo6eMCdt5xB4QQxRAU1jAyTG+BFWlvX8JBfKU3ataRk4S1qwcR1NJq7OYYzLo2of8L9815BeXMeBpfs1peOR9xqbuHHWpU9FvP7f+6WiwGN6WIpu9H8Y7KEG46RhNtWIww+SIR0mG0rwEMKF+p4rY0qGfZew4Ob8K3TUxXYMhdBpYMW/PDPnwh9RTfyFtfOJPKzc529TTNwnJnYw+vDzJBvd2vFst6gBYvjgAXo1w8ypMmWib6NDg+QeG2hkRj/Vd0UQUiPL71jA=----ATTACHMENT:----OTMwNDgzODU1NDA4OTM2NSA4ODUxMDQ5MDM3MTA4MzUzIDk5OTI4Njg0NzU3MzQ4NTg=