Class: Mpp::Events::Dispatcher
- Inherits:
-
Object
- Object
- Mpp::Events::Dispatcher
- Extended by:
- T::Sig
- Defined in:
- lib/mpp/events.rb
Instance Method Summary collapse
- #emit(name, payload) ⇒ Object
- #emit_first(name, payload) ⇒ Object
- #has_handlers?(name = nil) ⇒ Boolean
-
#initialize(event_names:) ⇒ Dispatcher
constructor
A new instance of Dispatcher.
- #on(name, handler = nil, &block) ⇒ Object
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
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
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 |