/**
* Memoize
*
* From [Wikipedia](https://en.wikipedia.org/wiki/Memoization),
* memoization is an optimization technique
* used primarily to speed up computer programs,
* by storing the results of expensive function calls
* and returning the cached result when the same inputs occur again
*
* This function is a first class objects,
* which lets us use it as [Higher-Order Function](https://eloquentjavascript.net/05_higher_order.html)
* and return another function
*
* @param {Function} func Original function
* @returns {Function} Memoized function
*/
export const memoize = (func) => {
// Initialization of a slot to store the function result
const cache = {}
return (...args) => {
// Retrieving the first argument of the function
const [arg] = args
/**
* Checks if the argument is already present in the cache,
* then return the associated value / result
*/
if (arg in cache) {
return cache[arg]
}
/**
* If the argument is not yet present in the cache,
* execute original function and save its value / result in cache,
* finally return it
*/
const result = func(arg)
cache[arg] = result
return result
}
}