RoutesMaker/Public/ecma/Models/EventModel.ecma.js

87 lines
1.9 KiB
JavaScript

"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.<any|null>}
*/
/**
* @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.<event_model_callback>} */
events = [];
/** @type {boolean} */
this.autoexecute = false;
/**
* @param {...any} [parameters]
* @returns {Array.<any|null>}
* @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;
})();