@antv/util
Version:
> AntV 底层依赖的工具库,不建议在自己业务中使用。
71 lines (62 loc) • 1.75 kB
text/typescript
function flru(max: number) {
let num, curr, prev;
const limit = max || 1;
function keep(key, value) {
if (++num > limit) {
prev = curr;
reset(1);
++num;
}
curr[key] = value;
}
function reset(isPartial?: number) {
num = 0;
curr = Object.create(null);
isPartial || (prev = Object.create(null));
}
reset();
return {
clear: reset,
has: function (key) {
return curr[key] !== void 0 || prev[key] !== void 0;
},
get: function (key) {
var val = curr[key];
if (val !== void 0) return val;
if ((val = prev[key]) !== void 0) {
keep(key, val);
return val;
}
},
set: function (key, value) {
if (curr[key] !== void 0) {
curr[key] = value;
} else {
keep(key, value);
}
},
};
}
const CacheMap = new Map<Function, ReturnType<typeof flru>>();
/**
* 缓存函数的计算结果,避免重复计算
* @example
* _.memoize(calColor);
* _.memoize(calColor, (...args) => args[0]);
* @param fn 缓存的函数
* @param resolver 生成缓存 key 的函数
* @param maxSize lru 缓存的大小
*/
export default function memoize<T extends Function>(fn: T, resolver?: (...args: any[]) => string, maxSize = 128) {
const memoized = function (...args) {
// 使用方法构造 key,如果不存在 resolver,则直接取第一个参数作为 key
const key = resolver ? resolver.apply(this, args) : args[0];
if (!CacheMap.has(fn)) CacheMap.set(fn, flru(maxSize));
const cache = CacheMap.get(fn);
if (cache.has(key)) return cache.get(key);
const result = fn.apply(this, args);
cache.set(key, result);
return result;
};
return memoized as unknown as T;
}