class Svent::EventManger

Attributes

events[R]

Public Class Methods

new() click to toggle source
# File lib/svent/event_manger.rb, line 93
def initialize
  @events = {}
  @event_callback_fibers = []
  @next_callback_fibers = []
  Helper.init(@events, @event_callback_fibers)
end

Public Instance Methods

debug_arr() click to toggle source
# File lib/svent/event_manger.rb, line 110
def debug_arr
  arr = []
  next_arr = []
  @event_callback_fibers.each{|o| arr.push [o.name, o.object_id] }
  @next_callback_fibers.each{|o| next_arr.push [o.name, o.object_id] }
  {callback: arr, next: next_arr}
end
event(name, info) click to toggle source
# File lib/svent/event_manger.rb, line 166
def event(name, info)
  @events[name] ? @events[name].info = info : Event.new(name, info)
end
event_info(name, key, value) click to toggle source
# File lib/svent/event_manger.rb, line 170
def event_info(name, key, value)
  event = @events[name] ||= Event.new(name, info)
  event.info[key] = value
end
have(name) click to toggle source
# File lib/svent/event_manger.rb, line 175
def have(name)
  @events.each { |event| return true if event.name == name }
  false
end
logger(*arg) click to toggle source
# File lib/svent/event_manger.rb, line 118
def logger(*arg)
  str = ''
  arg.each{ |s| str += "#{s}, " }
  $log.write "#{str[0, str.size - 2]}\n"
end
on(name, info = nil, index = nil, &callback) click to toggle source
# File lib/svent/event_manger.rb, line 156
def on(name, info = nil, index = nil, &callback)
  name = name.to_sym if name.class == String
  if name == :event_manger_stop?
    raise 'error:The event(:event_manger_stop?) can only have one callback.' if @events.include?(:event_manger_stop?)
  end
  event = @events[name] ||= Event.new(name, info)
  index = event.length unless index
  event[index] = callback
end
stop() click to toggle source
# File lib/svent/event_manger.rb, line 100
def stop
  trigger(:event_manger_stop)
  trigger(:event_manger_stop?)
end
stop?() click to toggle source
# File lib/svent/event_manger.rb, line 105
def stop?
  @next_callback_fibers == [] && @event_callback_fibers == []
end
trigger(name, info = nil) click to toggle source
# File lib/svent/event_manger.rb, line 144
def trigger(name, info = nil)
  if info
    def info.method_missing(sym)
      self[sym] if self.key?(sym)
    end
  end
  name = name.to_sym if name.class == String
  event = @events[name]
  event.each{ |callback| @event_callback_fibers.push(EventCallbackFiber.new(Helper, name, callback, info)) } if event
  logger 'trigger:', name, debug_arr, @event_callback_fibers.size if Svent::DEBUG
end
update() click to toggle source
# File lib/svent/event_manger.rb, line 125
def update
  logger '='*4+'update' if Svent::DEBUG
  if @event_callback_fibers != []
    @next_callback_fibers = []
    loop do
      obj = @event_callback_fibers.pop
      break unless obj
      logger "==fiber-#{obj.name}(#{obj.object_id}) call:" if Svent::DEBUG
      logger'before:', debug_arr, @event_callback_fibers.size if Svent::DEBUG
      Helper.this = obj
      obj.resume
      Helper.this = nil
      logger'after:', debug_arr, @event_callback_fibers.size if Svent::DEBUG
      @next_callback_fibers.push obj if obj.alive?
    end
    @event_callback_fibers = @next_callback_fibers
  end
end