Memoize a value.
Memoize, cache, value or result of a function call.ppSan
javascript
a year ago
3.6 kB
8
Indexable
Utils
// noinspection ES6ConvertVarToLetConst
/**
* Cache or memoize data.
*
* @example
* var vx_cacheador = new ItMemoize();
* vx_cacheador.ttlSecondsDefault = 3600; // default is 0 never expire.
* function calculateAndMemoize(a, b) {
* let k = vx_cacheador.keyMake('calculateAndMemoize', arguments);
* if(vx_cacheador.hasItem(k)) return vx_cacheador.getItem(k);
* let calculate = a + b;
* return vx_cacheador.setItem(k, calculate, ttlSeconds); // ttl <= 0: forever, undefined use vx_cacheador.ttlSecondsDefault
* }
* @returns {{delItem: delItem, hasItem: ((function(string): boolean)|*), getItem: (function(string): *), ttlSecondsDefault: number, keyMake: (function(string, *): string), setItem: (function(string, *, number=): *)}}
* @constructor
*/
function ItMemoize() {
if (!(this instanceof ItMemoize))
throw "Error usage: var memoizer = new ItMemoize();";
var _memoize = {};
var ttlSecondsDefault = 0;
/**
* Create a key by concatenating the functionName and key parameter values.
*
* @param {string} functionName - The name of the function.
* @param {any} key - The key parameter value.
* @returns {string} - The key created by concatenating the functionName and key parameter values.
*/
function keyMake(functionName, key) {return functionName + "\t" + JSON.stringify(key);}
/**
* Set an item in the storage.
*
// * @param {string} key - The key to store the item under.
* @param {*} value - The value to be stored.
* @param {number} [ttlSeconds] - The time-to-live for the item in seconds. Defaults to 0 (no expiration).
* @returns {*} - The stored value.
*/
function setItem(key, value, ttlSeconds) {
_memoize[key] = {
value:value,
ttl: typeof ttlSeconds === 'undefined' ? ttlSecondsDefault : parseInt(ttlSeconds) || ttlSecondsDefault,
timestamp: new Date()
};
return value;
}
/**
* Retrieves the value associated with a given key from the memoization cache.
*
* @param {string} key - The key of the item to retrieve from the cache.
* @returns {any} - The value associated with the given key, or undefined if the key does not exist in the cache.
*/
function getItem(key) {return _memoize[key].value || undefined;}
/**
* Checks if an item with the given key is present in the memoize cache.
*
* @param {string} key - The key to check for.
* @returns {boolean} - Returns `true` if the item is present and hasn't expired, otherwise `false`.
*/
function hasItem(key) {
if(!_memoize.hasOwnProperty(key))
return false;
var cachedItem = _memoize[key];
if(cachedItem.ttl <= 0)
return true;
return Date.now() - cachedItem.timestamp < cachedItem.ttl;
}
/**
* Deletes an item from the memoization cache.
*
* @param {string} key - The key of the item to delete.
*/
function delItem(key) {delete _memoize[key];}
function delFunctionName(functionName) {
let functionNameTerminated = functionName + "\t";
for(let key in _memoize)
if(_memoize.hasOwnProperty(key) && key.startsWith(functionNameTerminated))
delete _memoize[key]
}
return {
keyMake:keyMake,
setItem:setItem,
hasItem:hasItem,
getItem:getItem,
delItem:delItem,
delFunctionName:delFunctionName,
ttlSecondsDefault:ttlSecondsDefault
};
}
Editor is loading...
Leave a Comment