"use strict"; /** * @class * @constructor * @returns {void} * @access public */ const X = (function(){ /** * @constructs X * @returns {void} * @access private */ const X = function(){ /** @type {X} */ const self = this; /** @type {number} */ this.frames_per_second = 60; /** @type {number} */ this.threads_mode = X.THREADS_MODE_ANIMATION; /** * @returns {number} * @access private */ const thread_timer = () => self.frames_per_second && 1000 / self.frames_per_second; /** * @returns {void} * @access private */ const execute_threads_by_mode = () => { switch(self.threads_mode){ case X.THREADS_MODE_INTERVAL: /** @type {Object.} */ const cache = { frames_per_second : self.frames_per_second, mode : self.threads_mode }, /** @type {number} */ interval = setInterval(() => { execute_threads(); if( cache.frames_per_seconds != self.frames_per_second || cache.mode != self.threads_mode ){ clearInterval(interval); execute_threads_by_mode(); }; }, thread_timer()); break; case X.THREADS_MODE_TIMEOUT: setTimeout(() => { execute_threads(); execute_threads_by_mode(); }, thread_timer()); break; case X.THREADS_MODE_ANIMATION: default: /** @type {number} */ const time = Date.now(), /** @type {number} */ timer = thread_timer(); requestAnimationFrame(() => { execute_threads(); setTimeout(() => { execute_threads_by_mode(); }, timer - (Date.now() - time)); }); break; }; }; /** @type {number} */ X.THREADS_MODE_INTERVAL = 1 << 0; /** @type {number} */ X.THREADS_MODE_TIMEOUT = 1 << 1; /** @type {number} */ X.THREADS_MODE_ANIMATION = 1 << 2; /** * @returns {void} * @access private */ const execute_threads = () => {}; execute_threads_by_mode(); }; return X; })(); /** @type {X} */ const x = X();