Class: Rockbox::EventEmitter
- Inherits:
-
Object
- Object
- Rockbox::EventEmitter
- Defined in:
- lib/rockbox/events.rb
Overview
Lightweight typed event emitter. The set of valid events is documented below; emitting an unknown event still works (no enforcement) so plugins can publish their own.
Built-in events:
| Event | Payload | |——————–|————————————–| | :track_changed | Rockbox::Track | | :status_changed | Integer (Rockbox::PlaybackStatus) | | :playlist_changed | Rockbox::Playlist | | :ws_open | nil | | :ws_close | nil | | :ws_error | Exception/StandardError |
Instance Method Summary collapse
- #emit(event, payload = nil) ⇒ Object
-
#initialize ⇒ EventEmitter
constructor
A new instance of EventEmitter.
- #off(event, listener = nil, &block) ⇒ Object
- #on(event, &block) ⇒ Object
- #once(event, &block) ⇒ Object
- #remove_all_listeners(event = nil) ⇒ Object
Constructor Details
#initialize ⇒ EventEmitter
Returns a new instance of EventEmitter.
19 20 21 22 |
# File 'lib/rockbox/events.rb', line 19 def initialize @listeners = Hash.new { |h, k| h[k] = [] } @lock = Mutex.new end |
Instance Method Details
#emit(event, payload = nil) ⇒ Object
56 57 58 59 60 61 62 63 64 65 |
# File 'lib/rockbox/events.rb', line 56 def emit(event, payload = nil) listeners = @lock.synchronize { @listeners[event.to_sym].dup } listeners.each do |listener| if listener.arity.zero? || payload.nil? listener.call else listener.call(payload) end end end |
#off(event, listener = nil, &block) ⇒ Object
44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/rockbox/events.rb', line 44 def off(event, listener = nil, &block) target = block || listener @lock.synchronize do if target.nil? @listeners.delete(event.to_sym) else @listeners[event.to_sym].delete(target) end end self end |
#on(event, &block) ⇒ Object
26 27 28 29 30 |
# File 'lib/rockbox/events.rb', line 26 def on(event, &block) raise ArgumentError, "block required" unless block @lock.synchronize { @listeners[event.to_sym] << block } self end |
#once(event, &block) ⇒ Object
34 35 36 37 38 39 40 41 42 |
# File 'lib/rockbox/events.rb', line 34 def once(event, &block) raise ArgumentError, "block required" unless block wrapper = nil wrapper = lambda do |*args| off(event, wrapper) block.call(*args) end on(event, &wrapper) end |
#remove_all_listeners(event = nil) ⇒ Object
67 68 69 70 71 72 73 74 75 76 |
# File 'lib/rockbox/events.rb', line 67 def remove_all_listeners(event = nil) @lock.synchronize do if event @listeners.delete(event.to_sym) else @listeners.clear end end self end |