Advertisement
Guest User

Untitled

a guest
Sep 20th, 2019
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.30 KB | None | 0 0
  1. local Object = require 'lib.classic'
  2.  
  3. local function push (t, ...)
  4. local pushed = select('#', ...)
  5.  
  6. for i=1, pushed do
  7. t[t.n + i] = select(i, ...)
  8. end
  9.  
  10. return t.n + pushed
  11. end
  12.  
  13. local function clean (t, n)
  14. local removed = n - t.n
  15.  
  16. for i=(t.n + 1), n do
  17. t[i] = nil
  18. end
  19. end
  20.  
  21. local EventEmitter = Object:extend()
  22.  
  23. function EventEmitter:emit(eventName, ...)
  24. if not self.subscribers then return end
  25. local subscriptions = self.subscribers[eventName]
  26. if not subscriptions or #subscriptions == 0 then return end
  27.  
  28. for i = 1, #subscriptions do
  29. local sub = subscriptions[i]
  30. local ok, message
  31.  
  32. if sub.args then
  33. local n = push(sub.args, ...)
  34. ok, message = pcall(sub.listener, unpack(sub.args, 1, n))
  35. clean(sub.args, n)
  36. else
  37. ok, message = pcall(sub.listener, ...)
  38. end
  39.  
  40. if not ok then
  41. log.error(message)
  42. end
  43. end
  44. end
  45.  
  46. function EventEmitter:on(eventName, listener, ...)
  47. if not self.subscribers then
  48. self.subscribers = setmetatable({}, { __k = 'kv' })
  49. end
  50.  
  51. if not self.subscribers[eventName] then
  52. self.subscribers[eventName] = {}
  53. end
  54.  
  55. local newSub = {
  56. listener = listener,
  57. }
  58.  
  59. local n = select('#', ...)
  60. if n > 0 then
  61. newSub.args = { n = n, ... }
  62. end
  63.  
  64. table.insert(self.subscribers[eventName], newSub)
  65. end
  66.  
  67. return EventEmitter
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement