kdf
Version:
88 lines (53 loc) • 1.95 kB
text/coffeescript
KDEventEmitter = require './eventemitter.coffee'
module.exports = class KDEventEmitter.Wildcard extends KDEventEmitter
wildcardKey = '*'
listenerKey = '_listeners'
constructor: (options = {}) ->
super
= options.delimiter or '.'
setMaxListeners: (n) -> = n
getAllListeners = (node, edges, i = 0) ->
listeners = []
straight = node[listenerKey] if i is edges.length
wild = node[wildcardKey]
nextNode = node[edges[i]]
if straight?
listeners = listeners.concat straight
if wild?
listeners = listeners.concat getAllListeners wild, edges, i + 1
if nextNode?
listeners = listeners.concat getAllListeners nextNode, edges, i + 1
return listeners
removeAllListeners = (node, edges, it, i = 0) ->
edge = edges[i]
nextNode = node[edge]
if nextNode?
return removeAllListeners nextNode, edges, it, i + 1
if it? and (listeners = node[listenerKey])?
node[listenerKey] = (listener for listener in listeners \
when listener isnt it)
else node[listenerKey] = []
return
emit: (eventName, rest...) ->
"use strict"
oldEvent = if 'event'
= eventName
listeners = getAllListeners , eventName.split
listener.apply this, rest for listener in listeners
if oldEvent?
then = oldEvent
else delete
return this
off: (eventName, listener) ->
removeAllListeners , ((eventName ? '*').split ), listener
return this
on: (eventName, listener) ->
unless 'function' is typeof listener
throw new Error 'listener is not a function'
'newListener', eventName, listener
edges = eventName.split
node =
node = node[edge] ?= {} for edge in edges
listeners = node[listenerKey] ?= []
listeners.push listener
return this