Last active
August 29, 2015 14:23
-
-
Save voltrevo/5f792b8086f14023a700 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'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; | |
}; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'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'); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'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