if (typeof module === 'object' && module.exports)
{
Debug = {Log:console.log};
}
class Action
{
constructor()
{
this.listeners = new Map();
this.haveMessaged100 = false;
this.haveMessaged200 = false;
this.haveMessaged500 = false;
}
addListener(obj, func, multipleListeners /* = false*/)
{
if (multipleListeners === undefined) multipleListeners = false;
if (typeof func !== 'function')
{
throw new Error("Bad callback passed to Action");
}
if (multipleListeners && this.listeners.has(obj))
{
var existing = this.listeners.get(obj);
if (Array.isArray(existing))
{
existing.push(func);
}
else
{
this.listeners.set(obj, [existing, func]);
}
if (existing.length > 100 && !this.haveMessaged100)
{
Debug.Log("Over 100 function listeners for object!!!" + obj.constructor.name + " func:" + func.name);
this.haveMessaged100 = true;
}
if (existing.length > 200 && !this.haveMessaged200)
{
Debug.Log("Over 200 function listeners for object!!!" + obj.constructor.name + " func:" + func.name);
this.haveMessaged200 = true;
}
if (existing.length > 500 && !this.haveMessaged500)
{
Debug.Log("Over 500 function listeners for object!!!" + obj.constructor.name + " func:" + func.name);
this.haveMessaged500 = true;
}
}
else
{
this.listeners.set(obj, func);
}
if (this.listeners.size > 100 && !this.haveMessaged100)
{
Debug.Log("Over 100 object listeners!!! obj:" + obj.constructor.name + " func:" + func.name);
this.haveMessaged100 = true;
}
}
removeListener(obj, func)
{
if (this.listeners.has(obj))
{
let potentialListeners = this.listeners.get(obj);
// multiple listeners
if (Array.isArray(potentialListeners) && potentialListeners.length > 1 && func !== undefined)
{
//if (func !== undefined)
//{
potentialListeners.remove(func);
/*}
else
{
// TODO webgl... tag funcs somehow?
this.listeners.values[index].shift();
}*/
}
else
{
this.listeners.delete(obj);
}
}
}
setListener(obj, func)
{
if (!func || !func.apply)
{
throw new Error("Bad callback passed to Action");
}
this.listeners.clear();
this.listeners.set(obj, func);
}
callInternal(objAndFuncs, args)
{
for(var i = 0; i < objAndFuncs.length; i++)
{
var obj = objAndFuncs[i][0];
var func = objAndFuncs[i][1];
if (Array.isArray(func))
{
for (var j = 0; j < func.length; j++)
{
func[j].apply(obj, args);
}
}
else
{
func.apply(obj, args);
}
}
}
clearAndCall()
{
var tmpListeners = this.listeners;
this.listeners = new Map();
this.callInternal(Array.from(tmpListeners.entries()), arguments);
}
clear()
{
this.listeners = new Map();
}
call()
{
const tmp = Array.from(this.listeners.entries());
this.callInternal(tmp, arguments);
}
clearAndGetCall()
{
var tmp = Array.from(this.listeners.entries());
this.listeners.clear();
var func = (...args) =>
{
this.callInternal(tmp, args);
};
return func;
}
}
if (typeof module === 'object' && module.exports) module.exports = Action;