Skip to content

Instantly share code, notes, and snippets.

@madx
Last active August 29, 2015 14:06
Show Gist options
  • Save madx/e7af775f766f7a3adcb9 to your computer and use it in GitHub Desktop.
Save madx/e7af775f766f7a3adcb9 to your computer and use it in GitHub Desktop.
Event emitter mixin
// -- Emitter mixin
function Emitter(base) {
var _eventHandlers = []
function on(eventName, callback) {
var filter = makePattern(eventName)
_eventHandlers.push({
filter: filter,
callback: callback
})
}
function off(eventName, callback) {
var filter = makePattern(eventName)
var index = null
for (var i = 0, l = _eventHandlers.length; i < l; i++) {
var ev = _eventHandlers[i]
var sameFilter = String(filter) === String(ev.filter)
var sameCallback = callback === ev.callback
if (sameFilter && sameCallback) {
index = i
return false
}
})
if (index !== null) {
_eventHandlers.splice(index, 1)
}
}
function trigger(eventName) {
var args = [].slice.call(arguments, 1)
args.unshift(eventName)
console.log("trigger " + args.join(", "))
for (var i = 0, l = _eventHandlers.length; i < l; i++) {
var ev = _eventHandlers[i]
if (ev.filter.test(eventName)) {
setTimeout(function() {
console.log("on " + eventName)
ev.callback.apply(null, args)
}, 0)
}
})
}
function makePattern(eventName) {
return new RegExp("^" + eventName.replace("*", "(.*)") + "$")
}
base.on = on
base.off = off
base.trigger = trigger
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment