Class: MIDIOps::Handler
- Inherits:
-
Object
- Object
- MIDIOps::Handler
- Defined in:
- lib/midiops/handler.rb
Defined Under Namespace
Modules: Status
Instance Method Summary collapse
- #add(event, handler) ⇒ Object
- #clear_state ⇒ Object
- #defer(handler, args = []) ⇒ Object
- #handle(event) ⇒ Object
-
#initialize ⇒ Handler
constructor
A new instance of Handler.
- #status ⇒ Object
Constructor Details
#initialize ⇒ Handler
Returns a new instance of Handler.
16 17 18 19 20 |
# File 'lib/midiops/handler.rb', line 16 def initialize @handlers = {} @events = [] # pool for events not processed @handler_args = [] # args to pass to handler method end |
Instance Method Details
#add(event, handler) ⇒ Object
22 23 24 |
# File 'lib/midiops/handler.rb', line 22 def add event, handler @handlers.set_by_keys event, handler end |
#clear_state ⇒ Object
46 47 48 49 |
# File 'lib/midiops/handler.rb', line 46 def clear_state @events.clear @handler_args.clear end |
#defer(handler, args = []) ⇒ Object
42 43 44 |
# File 'lib/midiops/handler.rb', line 42 def defer handler, args=[] EM.defer(Proc.new { handler.call(*args) }) unless handler.nil? end |
#handle(event) ⇒ Object
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
# File 'lib/midiops/handler.rb', line 51 def handle event @events << event case status when Status::HAS_HANDLER defer @handlers.get_by_keys(*@events), @handler_args.dup clear_state when Status::HAS_HANDLER_WITH_ARG @handler_args << event @events.pop @events << :ARG defer( @handlers.get_by_keys(*@events), @handler_args.dup ) clear_state when Status::WAITING_ARG @handler_args << event @events.pop @events << :ARG when Status::NO_HANDLERS clear_state when Status::HANDLER_INDEFINITE end end |
#status ⇒ Object
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/midiops/handler.rb', line 26 def status if @handlers.get_by_keys(*@events).is_a? Proc Status::HAS_HANDLER elsif @handlers.get_by_keys(*(@events.take(@events.size - 1)), :ARG).is_a? Proc Status::HAS_HANDLER_WITH_ARG elsif @handlers.get_by_keys(*(@events.take(@events.size - 1)), :ARG).is_a? Hash Status::WAITING_ARG elsif @handlers.get_by_keys(*@events).is_a? Hash Status::HANDLER_INDEFINITE elsif @handlers.get_by_keys(*@events).nil? Status::NO_HANDLERS else raise RuntimeError, "Invalid handler status: #{self.inspect}" end end |