Class: Mpp::Events::Dispatcher

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/mpp/events.rb

Instance Method Summary collapse

Constructor Details

#initialize(event_names:) ⇒ Dispatcher

Returns a new instance of Dispatcher.



25
26
27
28
29
# File 'lib/mpp/events.rb', line 25

def initialize(event_names:)
  @event_names = T.let(event_names.to_h { |name| [name, true] }, T::Hash[String, T::Boolean])
  @event_names[ANY] = true
  @handlers = T.let(@event_names.keys.to_h { |name| [name, []] }, T::Hash[String, T::Array[T.untyped]])
end

Instance Method Details

#emit(name, payload) ⇒ Object



44
45
46
47
48
49
# File 'lib/mpp/events.rb', line 44

def emit(name, payload)
  return unless has_handlers?(name)

  emit_observers(name, payload)
  emit_any(name, payload)
end

#emit_first(name, payload) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/mpp/events.rb', line 52

def emit_first(name, payload)
  return nil unless has_handlers?(name)

  result = T.let(nil, T.untyped)

  T.must(@handlers[name]).each do |handler|
    value = call(handler, payload)
    next if empty_result?(value)

    result = value
    break
  end

  emit_any(name, payload)
  result
end

#has_handlers?(name = nil) ⇒ Boolean

Returns:

  • (Boolean)


70
71
72
73
74
# File 'lib/mpp/events.rb', line 70

def has_handlers?(name = nil)
  return @handlers.any? { |_event_name, handlers| !handlers.empty? } unless name

  !T.must(@handlers[name]).empty? || !T.must(@handlers[ANY]).empty?
end

#on(name, handler = nil, &block) ⇒ Object

Raises:

  • (ArgumentError)


32
33
34
35
36
37
38
39
40
41
# File 'lib/mpp/events.rb', line 32

def on(name, handler = nil, &block)
  raise ArgumentError, "Unknown event: #{name}" unless @event_names.key?(name)

  callback = handler || block
  raise ArgumentError, "handler is required" unless callback

  handlers = T.must(@handlers[name])
  handlers << callback
  Kernel.lambda { handlers.delete(callback) }
end