UNPKG

@gravityforms/utils

Version:
70 lines (60 loc) 1.69 kB
const callbacksFired = {}; /** * @module runOnce * @description Runs a given method only once, regardless of how many times it's called. * * @since 3.2.1 * * @param {Function} fn The method or function to execute once. * * @return {Function} A new function that, when called, executes the provided function only once. * * @example * const initializeLogging = initOnce(() => { * console.log('Logging initialized'); * }); * * initializeLogging(); // Logs 'Logging initialized' * initializeLogging(); // No output, as it's already initialized * */ const runOnce = ( fn ) => { const hash = hashFunction( fn ); if ( undefined === callbacksFired[ hash ] ) { callbacksFired[ hash ] = false; } return function() { if ( callbacksFired[ hash ] ) { return; } callbacksFired[ hash ] = true; fn.apply( this, arguments ); }; }; /** * @module hashFunction * @description Generates a hash for the given function using a simple string-based hashing algorithm. * * @since 3.2.1 * * @param {Function} fn The function to be hashed. * * @return {string} A string prefixed with 'orf_' followed by the hash value of the input function. * * @example * const myFunction = function() { console.log('Hello'); }; * const hash = hashFunction(myFunction); * console.log(hash); // Outputs something like 'orf_12345678' * */ const hashFunction = ( fn ) => { const str = String( fn ); let hash = 0; for ( let i = 0, len = str.length; i < len; i++ ) { const chr = str.charCodeAt( i ); hash = ( hash << 5 ) - hash + chr; // eslint-disable-line no-bitwise hash |= 0; // eslint-disable-line no-bitwise } return 'orf_' + hash; }; export default runOnce;