Class: Svent::EventManger

Inherits:
Object
  • Object
show all
Defined in:
lib/svent/event_manger.rb

Defined Under Namespace

Modules: Helper

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeEventManger

Returns a new instance of EventManger.



93
94
95
96
97
98
# File 'lib/svent/event_manger.rb', line 93

def initialize
  @events = {}
  @event_callback_fibers = []
  @next_callback_fibers = []
  Helper.init(@events, @event_callback_fibers)
end

Instance Attribute Details

#eventsObject (readonly)

Returns the value of attribute events.



91
92
93
# File 'lib/svent/event_manger.rb', line 91

def events
  @events
end

Instance Method Details

#debug_arrObject



110
111
112
113
114
115
116
# 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) ⇒ Object



166
167
168
# 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) ⇒ Object



170
171
172
173
# 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) ⇒ Object



175
176
177
178
# File 'lib/svent/event_manger.rb', line 175

def have(name)
  @events.each { |event| return true if event.name == name }
  false
end

#logger(*arg) ⇒ Object



118
119
120
121
122
# 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) ⇒ Object



156
157
158
159
160
161
162
163
164
# 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

#stopObject



100
101
102
103
# File 'lib/svent/event_manger.rb', line 100

def stop
  trigger(:event_manger_stop)
  trigger(:event_manger_stop?)
end

#stop?Boolean

Returns:

  • (Boolean)


105
106
107
# File 'lib/svent/event_manger.rb', line 105

def stop?
  @next_callback_fibers == [] && @event_callback_fibers == []
end

#trigger(name, info = nil) ⇒ Object



144
145
146
147
148
149
150
151
152
153
154
# 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

#updateObject



125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# 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