Spaces:
No application file
No application file
| class CallBack: | |
| def __init__(self, value, priority=0): | |
| self.priority = priority | |
| self.callback = value | |
| def call(self, *args, **kwargs): | |
| return self.callback(*args, **kwargs) | |
| def __call__(self, *args, **kwargs): | |
| return self.call(*args, **kwargs) | |
| class CallBackManager: | |
| def __init__(self, name): | |
| self.name = name | |
| self.callbacks: list[CallBack] = [] | |
| def register(self, callback: CallBack): | |
| self.callbacks.append(callback) | |
| self.callbacks.sort(key=lambda c: c.priority, reverse=True) | |
| def unregister(self, callback: CallBack): | |
| if callback in self.callbacks: | |
| self.callbacks.remove(callback) | |
| return True | |
| return False | |
| def call(self, *args, **kwargs): | |
| return [cb(*args, **kwargs) for cb in self.callbacks] | |
| def __call__(self, *args, **kwargs): | |
| return self.call(*args, **kwargs) | |
| callbacks: list[CallBackManager] = [] | |
| def get_manager(name) -> CallBackManager | None: | |
| """Get a callback manager by its registered name. (case insensitive)""" | |
| matches = [callback for callback in callbacks if callback.name.casefold() == name.casefold()] | |
| if len(matches) == 0: | |
| return register_new(name) | |
| return matches[0] | |
| def register_by_name(name: str, callback, priority: int = 0) -> CallBack | None: | |
| """Get and register a callback.""" | |
| callback = CallBack(callback, priority) | |
| manager = get_manager(name) | |
| if not manager: | |
| return None | |
| manager.register(callback) | |
| return callback | |
| def unregister_by_name(name: str, callback: CallBack) -> bool: | |
| """Unregister a callback based on its name.""" | |
| manager = get_manager(name) | |
| if not manager: | |
| return False | |
| return manager.unregister(callback) | |
| def register_new(name: str) -> CallBackManager: | |
| """ | |
| Please don't use duplicates. | |
| Please use "." to split your callback names instead of spaces. | |
| """ | |
| callback = CallBackManager(name) | |
| callbacks.append(callback) | |
| return callback | |
| def get_callbacks() -> list[str]: | |
| """Returns a list of all callback names.""" | |
| return [callback.name for callback in callbacks] | |