SignalsHandler.php 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. <?php
  2. namespace React\EventLoop;
  3. /**
  4. * @internal
  5. */
  6. final class SignalsHandler
  7. {
  8. private $signals = array();
  9. public function add($signal, $listener)
  10. {
  11. if (!isset($this->signals[$signal])) {
  12. $this->signals[$signal] = array();
  13. }
  14. if (\in_array($listener, $this->signals[$signal])) {
  15. return;
  16. }
  17. $this->signals[$signal][] = $listener;
  18. }
  19. public function remove($signal, $listener)
  20. {
  21. if (!isset($this->signals[$signal])) {
  22. return;
  23. }
  24. $index = \array_search($listener, $this->signals[$signal], true);
  25. unset($this->signals[$signal][$index]);
  26. if (isset($this->signals[$signal]) && \count($this->signals[$signal]) === 0) {
  27. unset($this->signals[$signal]);
  28. }
  29. }
  30. public function call($signal)
  31. {
  32. if (!isset($this->signals[$signal])) {
  33. return;
  34. }
  35. foreach ($this->signals[$signal] as $listener) {
  36. \call_user_func($listener, $signal);
  37. }
  38. }
  39. public function count($signal)
  40. {
  41. if (!isset($this->signals[$signal])) {
  42. return 0;
  43. }
  44. return \count($this->signals[$signal]);
  45. }
  46. public function isEmpty()
  47. {
  48. return !$this->signals;
  49. }
  50. }