2022-08-13 03:54:16 +00:00
|
|
|
# Python imports
|
2022-09-29 22:22:33 +00:00
|
|
|
from collections import defaultdict
|
2022-08-13 03:54:16 +00:00
|
|
|
|
|
|
|
# Lib imports
|
|
|
|
|
|
|
|
# Application imports
|
2023-03-28 01:07:17 +00:00
|
|
|
from .singleton import Singleton
|
2022-08-13 03:54:16 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
2023-03-28 01:07:17 +00:00
|
|
|
class EventSystem(Singleton):
|
2022-09-29 22:22:33 +00:00
|
|
|
""" Create event system. """
|
2022-08-13 03:54:16 +00:00
|
|
|
|
|
|
|
def __init__(self):
|
2022-09-29 22:22:33 +00:00
|
|
|
self.subscribers = defaultdict(list)
|
2023-10-20 02:06:20 +00:00
|
|
|
self._is_paused = False
|
2022-09-29 22:22:33 +00:00
|
|
|
|
2023-10-20 02:06:20 +00:00
|
|
|
self._subscribe_to_events()
|
|
|
|
|
|
|
|
|
|
|
|
def _subscribe_to_events(self):
|
|
|
|
self.subscribe("pause_event_processing", self._pause_processing_events)
|
|
|
|
self.subscribe("resume_event_processing", self._resume_processing_events)
|
|
|
|
|
|
|
|
def _pause_processing_events(self):
|
|
|
|
self._is_paused = True
|
|
|
|
|
|
|
|
def _resume_processing_events(self):
|
|
|
|
self._is_paused = False
|
2022-09-29 22:22:33 +00:00
|
|
|
|
|
|
|
def subscribe(self, event_type, fn):
|
|
|
|
self.subscribers[event_type].append(fn)
|
|
|
|
|
2023-01-23 01:51:45 +00:00
|
|
|
def unsubscribe(self, event_type, fn):
|
|
|
|
self.subscribers[event_type].remove(fn)
|
|
|
|
|
|
|
|
def unsubscribe_all(self, event_type):
|
|
|
|
self.subscribers.pop(event_type, None)
|
|
|
|
|
2022-10-01 04:30:38 +00:00
|
|
|
def emit(self, event_type, data = None):
|
2023-10-20 02:06:20 +00:00
|
|
|
if self._is_paused and event_type != "resume_event_processing":
|
|
|
|
return
|
|
|
|
|
2022-09-29 22:22:33 +00:00
|
|
|
if event_type in self.subscribers:
|
|
|
|
for fn in self.subscribers[event_type]:
|
|
|
|
if data:
|
2022-09-29 22:32:35 +00:00
|
|
|
if hasattr(data, '__iter__') and not type(data) is str:
|
2022-09-29 22:22:33 +00:00
|
|
|
fn(*data)
|
|
|
|
else:
|
|
|
|
fn(data)
|
|
|
|
else:
|
|
|
|
fn()
|
2022-12-04 00:22:20 +00:00
|
|
|
|
|
|
|
def emit_and_await(self, event_type, data = None):
|
2023-10-20 02:06:20 +00:00
|
|
|
if self._is_paused and event_type != "resume_event_processing":
|
|
|
|
return
|
|
|
|
|
2023-01-23 01:51:45 +00:00
|
|
|
""" NOTE: Should be used when signal has only one listener and vis-a-vis """
|
2022-12-04 00:22:20 +00:00
|
|
|
if event_type in self.subscribers:
|
2023-03-05 21:42:11 +00:00
|
|
|
response = None
|
2022-12-04 00:22:20 +00:00
|
|
|
for fn in self.subscribers[event_type]:
|
|
|
|
if data:
|
|
|
|
if hasattr(data, '__iter__') and not type(data) is str:
|
2023-03-05 21:42:11 +00:00
|
|
|
response = fn(*data)
|
2022-12-04 00:22:20 +00:00
|
|
|
else:
|
2023-03-05 21:42:11 +00:00
|
|
|
response = fn(data)
|
2022-12-04 00:22:20 +00:00
|
|
|
else:
|
2023-03-05 21:42:11 +00:00
|
|
|
response = fn()
|
|
|
|
|
|
|
|
if not response in (None, ''):
|
|
|
|
break
|
|
|
|
|
|
|
|
return response
|