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