decojs
Version:
Scalable frontend architecture
87 lines (70 loc) • 2.42 kB
JavaScript
define([], function () {
function publish(name, subscribers, data) {
subscribers.forEach(function (subscriber) {
subscriber.apply(subscriber, data);
});
}
function subscribeTo(name, subscribers, subscriber) {
var index = subscribers.indexOf(subscriber);
if(index < 0)
subscribers.push(subscriber);
return index < 0;
}
function unsubscribeFrom(name, subscribers, subscriber){
var index = subscribers.indexOf(subscriber);
if(index >= 0)
subscribers.splice(index, 1);
return index >= 0;
}
function extendEvent(name, event){
event.subscribers = [];
event.subscribeSubscribers = [];
event.unsubscribeSubscribers = [];
var extendedEvent = function(){
if(arguments.length == 1 && typeof arguments[0] === "function"){
var subscriber = arguments[0];
var wasNew = subscribeTo(name, event.subscribers, subscriber);
if(wasNew)
publish(name+".isSubscribedTo", event.subscribeSubscribers, [function(){subscriber.apply(subscriber, arguments);}]);
}else{
publish(name, event.subscribers, arguments);
}
}
extendedEvent.dont = function(subscriber){
if(unsubscribeFrom(name, event.subscribers, subscriber))
publish(name+".isUnsubscribedFrom", event.unsubscribeSubscribers);
};
extendedEvent.isSubscribedTo = function(subscriber){
subscribeTo(name+".isSubscribedTo", event.subscribeSubscribers, subscriber);
};
extendedEvent.isSubscribedTo.dont = function(subscriber){
unsubscribeFrom(name+".isSubscribedTo", event.subscribeSubscribers, subscriber);
};
extendedEvent.isUnsubscribedFrom = function(subscriber){
subscribeTo(name+".isUnsubscribedFrom", event.unsubscribeSubscribers, subscriber);
};
extendedEvent.isUnsubscribedFrom.dont = function(subscriber){
unsubscribeFrom(name+".isUnsubscribedFrom", event.unsubscribeSubscribers, subscriber);
};
extendedEvent.toString = function(){
return "[Event "+name+"]";
}
return extendedEvent;
}
function extend(events){
for(var i in events){
events[i] = extendEvent(i, events[i]);
}
return events;
}
function create(arg1, arg2){
if(arg2)
return extendEvent(arg1, arg2);
else
return extendEvent("anonymous event", arg1)
}
return {
extend: extend,
create: create
};
});