Last active
August 29, 2015 14:10
-
-
Save sTiLL-iLL/3bcd54a7048066a98d86 to your computer and use it in GitHub Desktop.
Another version of my "Signals" event system.
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
// SignalsV2.js | |
(function () { | |
'use strict'; | |
function Signals () {}; | |
var exports = this, | |
signalsMap = {}, | |
_signalRtnVal_ = {}, | |
signals = Signals.prototype; | |
function isAry(obj) { | |
return (obj.constructor === Array); | |
}; | |
function _setSignalOnceRV (val) { | |
_signalRtnVal_ = val; | |
return this; | |
}; | |
function _getSignalOnceRV () { | |
if (_signalRtnVal_) { | |
return _signalRtnVal_; | |
} | |
else { | |
return true; | |
} | |
}; | |
function wen(nam, func) { | |
if (!signalsMap) { | |
signalsMap = {}; | |
} | |
if (!signalsMap[nam]) { | |
signalsMap[nam] = func; | |
} | |
else if (isAry(signalsMap[nam])) { | |
signalsMap[nam].push(func); | |
} | |
else { | |
signalsMap[nam] = [signalsMap[nam], func]; | |
} | |
return this; | |
}; | |
signals.signaled = function(nam, func) { | |
return wen(nam, function(evnt){ | |
return func(evnt); | |
}); | |
}; | |
signals.dropReceivers = function (nam) { | |
if (!nam) { | |
signalsMap = {}; | |
return this; | |
} | |
if (signalsMap && signalsMap[nam]) { | |
signalsMap[nam] = null; | |
} | |
return this; | |
}; | |
signals.receiverObjects = function (nam) { | |
var recvrLst = this.receivers(nam), rspns; | |
if (isAry(recvrLst)) { | |
rspns = {}; | |
rspns[nam] = recvrLst; | |
} | |
return rspns || recvrLst; | |
}; | |
signals.receivers = function (nam) { | |
if (!signalsMap) { | |
signalsMap = {}; | |
} | |
if (!signalsMap[nam]) { | |
signalsMap[nam] = []; | |
} | |
if (!isAry(signalsMap[nam])) { | |
signalsMap[nam] = [signalsMap[nam]]; | |
} | |
return signalsMap[nam]; | |
}; | |
signals.addReceiver = function(nam, func) { | |
return wen(nam, function(evnt){ | |
return func(evnt); | |
}); | |
}; | |
signals.signaledOnce = function (nam, func) { | |
var slf = this; | |
function onit () { | |
slf.dropReceiver(nam, wen); | |
func.apply(this, args); | |
}; | |
wen.receiver = func; | |
this.onit(nam, wen); | |
return this; | |
}; | |
signals.receiveOnce = function(nam, func) { | |
return signaledOnce(nam, function(evnt) { | |
return func(evnt); | |
}); | |
}; | |
signals.dropReceiver = function (nam, func) { | |
if (signalsMap && signalsMap[nam]) { | |
var sigLst = signalsMap[nam]; | |
if (isAry(sigLst)) { | |
var idx = -1; | |
for (var i = 0, l = sigLst.length; i < l; i++) { | |
if (sigLst[i] === func || (sigLst[i].receiver && sigLst[i].receiver === func)) { | |
idx = i; | |
break; | |
} | |
} | |
if (idx < 0) { | |
return this; | |
} | |
sigLst.splice(idx, 1); | |
if (!sigLst.length) { | |
delete signalsMap[nam]; | |
} | |
} | |
else if (sigLst === func || (sigLst.receiver && sigLst.receiver === func)) { | |
delete signalsMap[nam]; | |
} | |
} | |
return this; | |
}; | |
signals.signal = function (nam, args) { | |
var recvrLst = this.receiverObjects(nam), | |
k, recvr, i, rspns; | |
for (k in recvrLst ) { | |
if (recvrLst.hasOwnProperty(k)) { | |
i = recvrLst[k].length; | |
while (i--) { | |
recvr = recvrLst[k][i]; | |
if (recvr.signaledOnce === true) { | |
this.dropReceiver(nam, recvr); | |
} | |
rspns = recvr.call(this, args || []); | |
if (rspns === _getSignalOnceRV()) { | |
this.dropReceiver(nam, recvr); | |
} | |
} | |
} | |
} | |
return this; | |
}; | |
if (typeof module === 'object' && module.exports) { | |
module.exports = Signals; | |
} | |
else if (typeof define === 'function' && define.amd) { | |
define(function () { | |
return Signals; | |
}); | |
} | |
else { | |
exports.Signals = Signals; | |
} | |
}.call(this)); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment