diff --git a/lib/simplekit.rb b/lib/simplekit.rb index cd63429ed20a65ea53d9102134bb623a7c0a9a58..a50f7885134dc82fac4fd8c9bf91ce682f6a6b58 100644 --- a/lib/simplekit.rb +++ b/lib/simplekit.rb @@ -83,25 +83,7 @@ module SimpleKit @model_time = 0.0 @user_model.init while (current_event = @event_list.pop) - e = current_event.event - if @cancel_set.key? e - if @cancel_set[e] === nil - @cancel_set[e].delete nil - @cancel_set.delete e if @cancel_set[e].empty? - next - else - arg_match = false - for h in @cancel_set[e] do - if current_event.args >= h - arg_match = true - @cancel_set[e].delete h - @cancel_set.delete e if @cancel_set[e].empty? - break - end - end - next if arg_match - end - end + next if should_cancel?(current_event) @model_time = current_event.time if current_event.args.empty? @user_model.send(current_event.event) @@ -116,27 +98,46 @@ module SimpleKit def halt @event_list.clear end - end - private + private - # This is a private helper class for the EventScheduler class. - # Users should never try to access this directly. - class EventNotice - attr_reader :event, :time, :time_stamp, :priority, :args - - def initialize(event, time, delay, args) - @event = event - @time_stamp = time - @time = time + delay - @args = args - @priority = (@args && @args.key?(:priority)) ? @args.delete(:priority) : 10 + def should_cancel?(event_notice) + e = event_notice.event + if @cancel_set.key? e + if @cancel_set[e] === nil + @cancel_set[e].delete nil + @cancel_set.delete e if @cancel_set[e].empty? + return true + else + for hsh in @cancel_set[e] do + next unless event_notice.args >= hsh + @cancel_set[e].delete hsh + @cancel_set.delete e if @cancel_set[e].empty? + return true + end + end + end + false end - include Comparable - def <=>(other) - (time <=> other.time).tap do |outcome| - return priority <=> other.priority if outcome == 0 + # This is a private helper class for the EventScheduler class. + # Users should never try to access this directly. + class EventNotice + attr_reader :event, :time, :time_stamp, :priority, :args + + def initialize(event, time, delay, args) + @event = event + @time_stamp = time + @time = time + delay + @args = args + @priority = @args && @args.key?(:priority) ? @args.delete(:priority) : 10 + end + + include Comparable + def <=>(other) + (time <=> other.time).tap do |outcome| + return priority <=> other.priority if outcome == 0 + end end end end