Skip to content

Instantly share code, notes, and snippets.

@voltrevo
Last active August 29, 2015 14:23
Show Gist options
  • Save voltrevo/5f792b8086f14023a700 to your computer and use it in GitHub Desktop.
Save voltrevo/5f792b8086f14023a700 to your computer and use it in GitHub Desktop.
'use strict';
var mapWithDefault = require('./mapWithDefault');
module.exports = function addEventing(obj) {
var handlers = mapWithDefault(function() {
return [];
});
obj.trigger = function(evtName) {
var args = Array.prototype.slice(arguments);
args.shift();
var filterNeeded = false;
handlers.get(evtName).forEach(function(handler) {
if (handler.remainingCalls > 0) {
handler.remainingCalls--;
handler.fn.apply(undefined, args);
filterNeeded |= handler.remainingCalls <= 0;
}
});
if (filterNeeded) {
handlers.set(evtName, handlers.get(evtName).filter(function(handler) {
return handler.remainingCalls > 0;
}));
}
};
var onImpls = function(isOnce) {
var overloads = {
singleHandler: function(evtNames, fn) {
return overloads.arrayOfEvents(evtNames.split(' '), fn);
},
arrayOfEvents: function(evtNames, fn) {
evtNames.forEach(function(evtName) {
handlers.get(evtName).push({
fn: fn,
remainingCalls: isOnce ? 1 : Infinity
});
});
return obj;
},
mapOfHandlers: function(handlerMap) {
for (var evtNames in handlerMap) {
overloads.singleHandler(evtNames, handlerMap[evtNames]);
}
return obj;
}
};
return function(arg1) {
return overloads[
Array.isArray(arg1) ? 'arrayOfEvents' :
typeof arg1 === 'object' ? 'mapOfHandlers' :
'singleHandler'
].apply(undefined, arguments);
};
};
obj.on = onImpls(false);
obj.once = onImpls(true);
obj.off = function(evtNames, handlerToRemove) {
evtNames.split(' ').forEach(function(evtName) {
handlers.set(evtName, handlers.get(evtName).filter(function(handler) {
return handler.fn !== handlerToRemove;
}));
});
};
return obj;
};
'use strict';
var addEventing = require('./addEventing');
var x = addEventing({});
var fooHandler = function() {
console.log('foo event for x', arguments);
};
x.on('foo', fooHandler);
x.on('bar', function() {
console.log('bar event for x', arguments);
});
x.on('foo bar', function() {
console.log('foo or bar event for x', arguments);
});
console.log('A');
x.trigger('foo');
console.log('B');
x.off('foo', fooHandler);
console.log('C');
x.trigger('foo');
console.log('D');
x.trigger('bar');
console.log('E');
'use strict';
module.exports = function mapWithDefault(defaultGenerator) {
if (typeof defaultGenerator !== 'function') {
var defaultValue = defaultGenerator;
defaultGenerator = function() {
return defaultValue;
};
}
var map = {};
var underlyingMap = {};
map.get = function(key) {
var value = underlyingMap[key];
if (value === undefined) { // We assume that defaultGenerator never returns undefined
value = defaultGenerator();
underlyingMap[key] = value;
}
return value;
};
map.set = function(key, value) {
underlyingMap[key] = value;
};
return map;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment