function/memoize.jsjavascript
/**
 * 创建带 Map 缓存的记忆化函数。
 * @function memoize
 * @memberof module:function
 * @param {Function} fn 需要缓存的函数
 * @param {Function} [resolver] 根据参数生成缓存键的函数
 * @returns {Function} 记忆化函数,附带可读写的 cache 属性
 * @throws {TypeError} fn 或 resolver 不是函数时抛出
 */
function memoize(fn, resolver = (...args) => args[0]) {
  if (typeof fn !== 'function' || typeof resolver !== 'function') throw new TypeError('fn and resolver must be functions')
  const cache = new Map()
  const memoized = function (...args) {
    const key = resolver.apply(this, args)
    if (cache.has(key)) return cache.get(key)
    const result = fn.apply(this, args)
    cache.set(key, result)
    return result
  }
  memoized.cache = cache
  return memoized
}

export default memoize