"use strict"; import {Check} from "../Utils/Check.ecma.js"; import {Utils} from "../Utils/Utils.ecma.js"; /** * @callback event_model_callback * @param {!number} i * @param {...any} [parameters] * @returns {Array.} */ /** * @class * @constructor * @returns {void} * @access public * @static */ export const EventModel = (function(){ /** * @constructs EventModel * @returns {void} * @access private * @static */ const EventModel = function(){ /** @type {EventModel} */ const self = this, /** @type {Array.} */ events = []; /** @type {boolean} */ this.autoexecute = false; /** * @param {...any} [parameters] * @returns {Array.} * @access public */ this.execute = (...parameters) => events.map((event, i) => event ? event(i, ...parameters) : null); /** * @param {!event_model_callback} callback * @returns {number|null} * @access public */ this.add = callback => { /** @type {number|null} */ let i = null; if(Check.is_function(callback)){ if(self.autoexecute) Utils.execute(callback); else{ /** @type {number} */ const l = events.length; for(i = 0; i < l; i ++) if(!events[i]) break; events[i] = callback; }; }; return i; }; /** * @param {!number} i * @returns {void} * @access public */ this.remove = i => { Check.is_index(i) && i < events.length && events[i] && (events[i] = null); }; }; return EventModel; })();