AnP/Public/ecma/Managers/EventsManager.ecma.js

88 lines
2.1 KiB
JavaScript

"use string";
import {Utils} from "../Utils/Utils.ecma.js";
/**
* @callback anp_events_manager_callback
* @param {...any} [parameters]
* @returns {any|null}
*/
/**
* @class
* @constructor
* @param {?(Object.<string, any|null>|Array.<any|null>)} [inputs = null]
* @returns {void}
* @access public
*/
export const EventsManager = (function(){
/**
* @constructs EventsManager
* @param {?(Object.<string, any|null>|Array.<any|null>)} [inputs = null]
* @returns {void}
* @access private
*/
const EventsManager = function(inputs = null){
/** @type {Array.<Array.<anp_events_manager_callback|null, number>>} */
const events = [],
/** @type {EventsManager} */
self = this;
/** @type {boolean} */
this.autoexecute = Utils.get_value("autoexecute", inputs, false);
this.times = Utils.get_value("times", inputs, 0);
/**
* @param {...any} [parameters]
* @returns {Array.<any|null>}
* @access public
*/
this.execute = (...parameters) => events.map((event, i) => {
let value = null;
if(event){
value = Utils.execute(event[0], ...parameters);
self.times && ++ event[1] >= self.times && (events[i] = null);
};
return value;
});
/**
* @param {!anp_events_manager_callback} callback
* @returns {number}
* @access public
*/
this.add = callback => {
/** @type {number} */
let i = -1;
/** @type {number} */
const l = events.length;
while(++ i < l)
if(!events[i])
break;
events[i] = [callback, 0];
self.autoexecute && self.execute();
return i;
};
/**
* @param {!number} i
* @returns {void}
* @access public
*/
this.remove = i => {
events[i] && (events[i] = null);
};
};
return EventsManager;
})();