Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local Object = require 'lib.classic'
- local function push (t, ...)
- local pushed = select('#', ...)
- for i=1, pushed do
- t[t.n + i] = select(i, ...)
- end
- return t.n + pushed
- end
- local function clean (t, n)
- local removed = n - t.n
- for i=(t.n + 1), n do
- t[i] = nil
- end
- end
- local EventEmitter = Object:extend()
- function EventEmitter:emit(eventName, ...)
- if not self.subscribers then return end
- local subscriptions = self.subscribers[eventName]
- if not subscriptions or #subscriptions == 0 then return end
- for i = 1, #subscriptions do
- local sub = subscriptions[i]
- local ok, message
- if sub.args then
- local n = push(sub.args, ...)
- ok, message = pcall(sub.listener, unpack(sub.args, 1, n))
- clean(sub.args, n)
- else
- ok, message = pcall(sub.listener, ...)
- end
- if not ok then
- log.error(message)
- end
- end
- end
- function EventEmitter:on(eventName, listener, ...)
- if not self.subscribers then
- self.subscribers = setmetatable({}, { __k = 'kv' })
- end
- if not self.subscribers[eventName] then
- self.subscribers[eventName] = {}
- end
- local newSub = {
- listener = listener,
- }
- local n = select('#', ...)
- if n > 0 then
- newSub.args = { n = n, ... }
- end
- table.insert(self.subscribers[eventName], newSub)
- end
- return EventEmitter
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement