Advertisement
Guest User

Untitled

a guest
Feb 7th, 2016
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.56 KB | None | 0 0
  1.  
  2. #
  3. # EventEmitter -- emit event for event-driven programming
  4. #
  5. # All classes which emit event will extend the EventEmitter class
  6. #
  7. class EventEmitter
  8. # private _listeners
  9. #
  10. # All listeners is stored to _listeners.
  11. # Listener is composed of env and func.
  12. #
  13. # { env: [Object], func: [Function] }
  14. #
  15. # Listeners are composed of some events (each event has Listener array)
  16. #
  17. # { eventName:
  18. # [ { env: [Object], func: [Function] },
  19. # { env: [Object], func: [Function] } ],
  20. # eventName2:
  21. # [ { ... }, { ... } ] }
  22. #
  23. @_listeners
  24.  
  25. # static listen_once_suffix = '-once'
  26. #
  27. # the listener which is invoked only once is stored in
  28. # eventName + listen_once_suffix
  29. @listen_once_suffix: '-once'
  30.  
  31. constructor: () ->
  32. @_listeners = {}
  33.  
  34. # add event listener
  35. #
  36. # @param event : event name
  37. # @param env : to bind enviroment. otherwise "this" variable
  38. # @param listener : a function which is passed some arguments or no
  39. #
  40. addListener: (event, env, listener) ->
  41. unless @_listeners[event]?
  42. @_listeners[event] = []
  43.  
  44. @_listeners[event].push(env: env, func: listener)
  45.  
  46. # on event
  47. # alias for addListener
  48. on: (event, env, listener) ->
  49. this.addListener(
  50. event,
  51. env,
  52. listener
  53. )
  54.  
  55. # do listener once on event
  56. #
  57. # @param event : event name
  58. # @param env : to bind enviroment. otherwise "this" variable
  59. # @param listener : a function which is passed some arguments or no
  60. #
  61. once: (event, env, listener) ->
  62. this.addListener(
  63. event + EventEmitter.listen_once_suffix,
  64. env,
  65. listener
  66. )
  67.  
  68. # remove specified listener from event
  69. #
  70. # @param event : event name
  71. # @param env : binded enviroment
  72. # @param listener : a function which is passed some arguments or no
  73. #
  74. removeListener: (event, env, listener) ->
  75. # event
  76. if @_listeners[event]?
  77. @_listeners[event] = @_listeners[event].filter (listeners) ->
  78. listeners.env != env || listeners.func != listener
  79.  
  80. # event-once
  81. event_once = event + EventEmitter.listen_once_suffix
  82. if @_listeners[event_once]?
  83. @_listeners[event_once] = @_listeners[event_once].filter (listeners) ->
  84. listeners.env != env || listeners.func != listener
  85.  
  86. # remove all listener from event
  87. #
  88. # @param event : event name
  89. #
  90. removeAllListener: (event) ->
  91. # event
  92. if @_listeners[event]?
  93. delete @_listeners[event]
  94.  
  95. # event-once
  96. event_once = event + EventEmitter.listen_once_suffix
  97. if @_listeners[event_once]
  98. delete @_listeners[event_once]
  99.  
  100. # get listeners
  101. #
  102. # @return specified event listeners
  103. #
  104. listeners: (event) ->
  105. @_listeners[event]
  106.  
  107. # get all listeners (for debug)
  108. allListeners: () ->
  109. @_listeners
  110.  
  111. # issue the event
  112. #
  113. # @param event : event name
  114. # @param args : pass to listeners
  115. #
  116. emit: (event, args...) ->
  117. # event
  118. if @_listeners[event]?
  119. for listener in @_listeners[event]
  120. listener.func.apply(listener.env, args)
  121.  
  122. # event-once
  123. if @_listeners[event + EventEmitter.listen_once_suffix]?
  124. for listener in @_listeners[event + EventEmitter.listen_once_suffix]
  125. listener.func.apply(listener.env, args)
  126. # the listeners invoked are deleted
  127. delete @_listeners[event + EventEmitter.listen_once_suffix]
  128.  
  129.  
  130. # test main object
  131. class Object3D extends EventEmitter
  132. constructor: (@name) ->
  133. super
  134.  
  135. collide: () ->
  136. this.emit('collision', 'Object3D')
  137.  
  138. addCollisionListener: (env, func) ->
  139. this.on('collision', env, func)
  140.  
  141.  
  142. # test other object
  143. class AnotherObject3D
  144. constructor: (@objName) ->
  145.  
  146. collideNotice: (data) ->
  147. console.log "#{@objName} is collided by #{data}"
  148.  
  149.  
  150. mainObj = new Object3D('testObject')
  151. otherObj1 = new AnotherObject3D('another1')
  152. otherObj2 = new AnotherObject3D('another2')
  153. otherObj3 = new AnotherObject3D('another3')
  154. mainObj.addCollisionListener(otherObj1, otherObj1.collideNotice)
  155. mainObj.addCollisionListener(otherObj2, otherObj2.collideNotice)
  156. mainObj.addCollisionListener(otherObj3, otherObj3.collideNotice)
  157. mainObj.collide()
  158. mainObj.removeListener('collision', otherObj2, otherObj2.collideNotice)
  159. mainObj.collide()
  160.  
  161.  
  162. # ee = new EventEmitter()
  163. #
  164. # ee.once 'hoge', this, (data) ->
  165. # console.log "hello! #{data}"
  166. #
  167. # hello2 = (err, data) ->
  168. # console.log "hello2! #{data}"
  169. # ee.on 'hoge', this, hello2
  170. # ee.removeListener('hoge', this, hello2)
  171. #
  172. # ee.on 'hoge', this, (data) ->
  173. # console.log "world!"
  174. #
  175. # # ee.removeAllListener('hoge')
  176. #
  177. # ee.on 'hoge', (deta) ->
  178. # console.log "another world!"
  179. #
  180. # ee.emit('hoge')
  181. # ee.emit('hoge')
  182. #
  183. # console.log ee.allListeners()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement