Implemented subscription logic

This commit is contained in:
2024-03-10 23:06:00 +01:00
parent 39869d605c
commit 87d47f8ce8
11 changed files with 125 additions and 43 deletions

View File

@ -9,6 +9,12 @@ class TopicManager
/** @var array<string,Topic> */
private array $topics = [];
private SplObjectStorage $subscribers;
public function __construct()
{
$this->subscribers = new SplObjectStorage();
}
public function getTopic(string $topic): Topic
{
@ -25,6 +31,26 @@ class TopicManager
}
}
public function subscribe(SubscriberInterface $subscriber, array $topics): void
{
foreach ($topics as $topic) {
$this->getTopic($topic)->addSubscriber($subscriber);
}
}
public function unsubscribe(SubscriberInterface $subscriber, ?array $topics=null): void
{
if (!$topics) {
foreach ($this->topics as $topic) {
$topic->removeSubscriber($subscriber);
}
return;
}
foreach ($topics as $topic) {
$this->getTopic($topic)->removeSubscriber($subscriber);
}
}
public function getTopicCount(): int
{
return count($this->topics);
@ -32,7 +58,7 @@ class TopicManager
public function getSubscriberCount(): int
{
return array_sum(array_map(fn($t) => $t->getSubscriberCount(), $this->topics));
return count($this->subscribers);
}
public function garbageCollect(): void