-
-
Notifications
You must be signed in to change notification settings - Fork 48
/
Copy pathcache.ts
63 lines (55 loc) · 1.28 KB
/
cache.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/**
* Simple cache manager.
*
* refer: https://github.com/mysticatea/eslint-plugin-node/blob/f45c6149be7235c0f7422d1179c25726afeecd83/lib/util/cache.js
*/
const SKIP_TIME = 5000;
type CacheValue<T> = {
expire: number;
value: T;
};
/**
* The cache will dispose of each value if the value has not been accessed
* during 5 seconds.
* @returns getter and setter ofr the cache.
*/
export function createCache<T>(): {
get: (key: string) => T | null;
set: (key: string, value: T) => void;
} {
const map: Map<string, CacheValue<T>> = new Map();
/**
* Get the cached value of the given key.
* @param key The key to get.
* @returns The cached value or null.
*/
function get(key: string): T | null {
const entry = map.get(key);
const now = Date.now();
if (entry) {
if (entry.expire > now) {
entry.expire = now + SKIP_TIME;
return entry.value;
}
map.delete(key);
}
return null;
}
/**
* Set the value of the given key.
* @param key The key to set.
* @param value The value to set.
* @returns
*/
function set(key: string, value: T): void {
const entry = map.get(key);
const expire = Date.now() + SKIP_TIME;
if (entry) {
entry.value = value;
entry.expire = expire;
} else {
map.set(key, { value, expire });
}
}
return { get, set };
}