87 lines
1.9 KiB
JavaScript
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;
|
|
})(); |