Files
atom/src/subscriber.coffee
Kevin Sawicki 76332c76bd Flatten src directory
* Move src/app to src/
  * Move src/stdlib to src/
  * Remove src/app and src/stdlib from NODE_PATH
2013-08-19 20:13:57 -07:00

36 lines
1.2 KiB
CoffeeScript

_ = require 'underscore'
module.exports =
subscribeWith: (eventEmitter, methodName, args) ->
eventEmitter[methodName](args...)
@subscriptions ?= []
@subscriptionsByObject ?= new WeakMap
@subscriptionsByObject.set(eventEmitter, []) unless @subscriptionsByObject.has(eventEmitter)
eventName = _.first(args)
callback = _.last(args)
subscription = cancel: ->
# node's EventEmitter doesn't have 'off' method.
removeListener = eventEmitter.off ? eventEmitter.removeListener
removeListener.call eventEmitter, eventName, callback
@subscriptions.push(subscription)
@subscriptionsByObject.get(eventEmitter).push(subscription)
subscribe: (eventEmitter, args...) ->
@subscribeWith(eventEmitter, 'on', args)
subscribeToCommand: (eventEmitter, args...) ->
@subscribeWith(eventEmitter, 'command', args)
unsubscribe: (object) ->
if object?
for subscription in @subscriptionsByObject?.get(object) ? []
subscription.cancel()
_.remove(@subscriptions, subscription)
@subscriptionsByObject?.delete(object)
else
subscription.cancel() for subscription in @subscriptions ? []
@subscriptions = null
@subscriptionsByObject = null