From 9ef681399ebfd44af022e544f20d4e37d8fcadb4 Mon Sep 17 00:00:00 2001 From: Ye Wenbin Date: Sat, 29 Oct 2022 10:59:36 +0800 Subject: [PATCH] Remove state property in PrioritizedListenersForEvent --- src/PrioritizedListenersForEvent.php | 54 ++++++------------------ src/PrioritizedListenersForEventTest.php | 2 + 2 files changed, 16 insertions(+), 40 deletions(-) diff --git a/src/PrioritizedListenersForEvent.php b/src/PrioritizedListenersForEvent.php index 56f12b8..0e3a96c 100644 --- a/src/PrioritizedListenersForEvent.php +++ b/src/PrioritizedListenersForEvent.php @@ -13,61 +13,35 @@ class PrioritizedListenersForEvent { /** @var array> */ private $listeners = []; - /** @var array */ - private $sortedListeners = []; - /** @var bool */ - private $isSorted = false; - /** @var bool */ - private $containsOneTimeListener = false; + /** @var array|null */ + private $sortedListeners; public function addListener(callable $listener, int $priority): void { - $this->isSorted = false; + $this->sortedListeners = null; $this->listeners[$priority][] = $listener; - - if ($listener instanceof OneTimeListener) { - $this->containsOneTimeListener = true; - } } public function getListeners(): iterable { - if ($this->isSorted === false) { - $this->sortListeners(); - } - - $listeners = $this->sortedListeners; - - if ($this->containsOneTimeListener) { - $this->removeOneTimeListeners(); - } - - return $listeners; + return $this->sortedListeners ?? $this->sortListeners(); } - private function sortListeners(): void + private function sortListeners(): array { - $this->isSorted = true; - $this->sortedListeners = []; + $filter = static function ($listener): bool { + return $listener instanceof OneTimeListener === false; + }; krsort($this->listeners, SORT_NUMERIC); - - foreach ($this->listeners as $group) { + $listeners = []; + foreach ($this->listeners as $priority => $group) { foreach ($group as $listener) { - $this->sortedListeners[] = $listener; + $listeners[] = $listener; } + $this->listeners[$priority] = array_filter($group, $filter); } - } - - private function removeOneTimeListeners(): void - { - $filter = static function ($listener): bool { - return $listener instanceof OneTimeListener === false; - }; - - $this->sortedListeners = array_filter($this->sortedListeners, $filter); + $this->sortedListeners = array_filter($listeners, $filter); - foreach ($this->listeners as $priority => $listeners) { - $this->listeners[$priority] = array_filter($listeners, $filter); - } + return $listeners; } } diff --git a/src/PrioritizedListenersForEventTest.php b/src/PrioritizedListenersForEventTest.php index 78c59da..47d6c63 100644 --- a/src/PrioritizedListenersForEventTest.php +++ b/src/PrioritizedListenersForEventTest.php @@ -28,6 +28,8 @@ public function testOneTimeListener(): void $listener2 = $group->getListeners(); $this->assertCount(3, $listener2); $this->assertEquals([4, 2, 1], self::inspectListener($listener2)); + $listener3 = $group->getListeners(); + $this->assertEquals([4, 2, 1], self::inspectListener($listener3)); } public static function inspectListener(iterable $listeners): array