*/ private array $topics = []; public function getTopic(string $topic): Topic { if (!isset($this->topics[$topic])) { $this->topics[$topic] = new Topic($topic); } return $this->topics[$topic]; } public function publish(Message $message): void { foreach ($message->topic as $topic) { $this->getTopic($topic)->publish($message); } } public function getTopicCount(): int { return count($this->topics); } public function getSubscriberCount(): int { return array_sum(array_map(fn($t) => $t->getSubscriberCount(), $this->topics)); } public function garbageCollect(): void { $this->topics = array_filter( $this->topics, function (Topic $topic) { $topic->garbageCollect(); return ($topic->getHistorySize() > 0 && $topic->getSubscriberCount() > 0) || ($topic->getAge() < 60); } ); } }