class Dry::Events::Bus
Event
bus
An event bus stores listeners (callbacks) and events
@api private
Attributes
events[R]
@!attribute [r] events
@return [Hash] A hash with events registered within a bus
listeners[R]
@!attribute [r] listeners
@return [Hash] A hash with event listeners registered within a bus
Public Class Methods
new(events: EMPTY_HASH, listeners: LISTENERS_HASH.dup)
click to toggle source
Initialize a new event bus
@param [Hash] events A hash with events @param [Hash] listeners A hash with listeners
@api private
# File lib/dry/events/bus.rb, line 27 def initialize(events: EMPTY_HASH, listeners: LISTENERS_HASH.dup) @listeners = listeners @events = events end
Public Instance Methods
attach(listener, filter)
click to toggle source
@api private
# File lib/dry/events/bus.rb, line 51 def attach(listener, filter) events.each do |id, event| meth = event.listener_method if listener.respond_to?(meth) listeners[id] << [listener.method(meth), filter] end end end
can_handle?(object_or_event_id)
click to toggle source
@api private
# File lib/dry/events/bus.rb, line 83 def can_handle?(object_or_event_id) case object_or_event_id when String, Symbol events.key?(object_or_event_id) else events .values .map(&:listener_method) .any?(&object_or_event_id.method(:respond_to?)) end end
detach(listener)
click to toggle source
@api private
# File lib/dry/events/bus.rb, line 62 def detach(listener) listeners.each do |id, memo| memo.each do |tuple| current_listener, _ = tuple listeners[id].delete(tuple) if current_listener.receiver.equal?(listener) end end end
process(event_id, payload) { |event, listener| ... }
click to toggle source
@api private
# File lib/dry/events/bus.rb, line 33 def process(event_id, payload) listeners[event_id].each do |listener, filter| event = events[event_id].payload(payload) if filter.(payload) yield(event, listener) end end end
publish(event_id, payload)
click to toggle source
@api private
# File lib/dry/events/bus.rb, line 44 def publish(event_id, payload) process(event_id, payload) do |event, listener| listener.(event) end end
subscribe(event_id, filter, &block)
click to toggle source
@api private
# File lib/dry/events/bus.rb, line 72 def subscribe(event_id, filter, &block) listeners[event_id] << [block, filter] self end
subscribed?(listener)
click to toggle source
@api private
# File lib/dry/events/bus.rb, line 78 def subscribed?(listener) listeners.values.any? { |value| value.any? { |block, _| block.equal?(listener) } } end