Source code for simulations.utils.eventemitter

""" A port of the node.js EventEmitter functionality

Classes:

    :py:class:`EventEmitter`
      implements the event emitter functionality

"""

import collections
import sys


[docs]class EventEmitter(object): """ Handles event emitting and listening Public Methods: :py:meth:`~EventEmitter.add_listener` add a listener for an event :py:meth:`~EventEmitter.on` alias for :py:meth:`~EventEmitter.add_listener` :py:meth:`~EventEmitter.once` adds a listener, but only executes it once, then it is removed :py:meth:`~EventEmitter.emit` trigger the listeners for an event :py:meth:`~EventEmitter.remove_listener` remove a listener from an event :py:meth:`~EventEmitter.remove_all_listeners` remove all listeners from an event :py:meth:`~EventEmitter.listeners` get a copy of the listeners on an event :py:meth:`~EventEmitter.set_max_listeners` set the maximum number of listeners for an event before warnings are issued (default: 10, None for no limit) """ max_errstr = """" WARNING: Possible EventEmitter memory leak: {0} listeners added for {1}. Use set_max_listeners to increase the limit. """ def __init__(self): """ Initialize the EventEmitter """ self._map = collections.defaultdict(list) self._oncemap = collections.defaultdict(list) self._max_listeners = 10
[docs] def set_max_listeners(self, max_listeners): """ Set the maximum number of listeners for each event. Parameters: max_listeners the maximum number of listeners allowed (None for no limit) """ self._max_listeners = max_listeners return self
[docs] def add_listener(self, event, listener=None): """ Adds a listener to an event Parameters: event the event to listen for listener the handler for the event (should be a function / callable) """ if listener is not None: listeners = len(self._map[event]) if self._max_listeners is not None\ and listeners >= self._max_listeners: print >> sys.stderr, self.max_errstr.format(listeners + 1, event) self._map[event].append(listener) return self
[docs] def on(self, *args): """ Alias for add_listener """ return self.add_listener(*args)
[docs] def once(self, event, listener=None): """ Add a listener, but only execute it the first time the event occurs, then remove it Parameters: event the event to listen for listener the listener function / callable """ self.add_listener(event, listener) self._oncemap[event].append(listener) return self
[docs] def remove_listener(self, event, listener=None): """ Remove a listener from an event Parameters: event the event from which to remove it listener the handler to remove """ try: self._map[event].remove(listener) except ValueError: pass return self
[docs] def remove_all_listeners(self, event): """ Clears all listeners from an event Parameters: event the event to clear listeners from """ self._map[event] = [] return self
[docs] def listeners(self, event): """ Gets a COPY of the list of listeners on an event Parameters: event the event for which to lookup the listeners """ return self._map[event][:]
[docs] def emit(self, event, *args, **kwargs): """ Emit an event, triggering the handlers on it with certain arguments Parameters: event the event to trigger args arguments to pass to the triggered listeners kwargs keyword arguments to pass to the triggered listeners """ for listener in self._map[event][:]: listener(*args, **kwargs) for listener in self._oncemap[event]: self.remove_listener(event, listener) self._oncemap[event] = [] return self
Read the Docs v: latest
Versions
latest
Downloads
PDF
HTML
Epub
On Read the Docs
Project Home
Builds

Free document hosting provided by Read the Docs.