class MIDIOps::Handler
Public Class Methods
new()
click to toggle source
# 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
Public Instance Methods
add(event, handler)
click to toggle source
# File lib/midiops/handler.rb, line 22 def add event, handler @handlers.set_by_keys event, handler end
clear_state()
click to toggle source
# File lib/midiops/handler.rb, line 46 def clear_state @events.clear @handler_args.clear end
defer(handler, args=[])
click to toggle source
# File lib/midiops/handler.rb, line 42 def defer handler, args=[] EM.defer(Proc.new { handler.call(*args) }) unless handler.nil? end
handle(event)
click to toggle source
# 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()
click to toggle source
# 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