Use same lock values as mobile clients
[ProtonMail-WebClient.git] / packages / shared / lib / helpers / lru.ts
blob498cacdc558ee33c06c286a3b3a07944858a4532
1 interface Args<K, V> {
2     max: number;
3     onDispose?: ([key, value]: [K, V | undefined]) => void;
6 function createLRU<K, V>({ max, onDispose }: Args<K, V>): Map<K, V> {
7     const map = new Map<K, V>();
9     const getOldestKey = () => map.keys().next().value;
11     return {
12         get size() {
13             return map.size;
14         },
15         forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void, thisArg?: any) {
16             return map.forEach(callbackfn, thisArg);
17         },
18         clear: () => map.clear(),
19         has: (key: K) => map.has(key),
20         delete: (key: K) => map.delete(key),
21         entries: () => map.entries(),
22         keys: () => map.keys(),
23         values: () => map.values(),
24         [Symbol.iterator]: () => map[Symbol.iterator](),
25         get [Symbol.toStringTag]() {
26             return map[Symbol.toStringTag];
27         },
28         set: (key: K, value: V) => {
29             if (map.has(key)) {
30                 map.delete(key);
31             } else if (map.size === max) {
32                 const keyToDispose = getOldestKey();
33                 const valueToDispose = map.get(keyToDispose);
34                 map.delete(keyToDispose);
35                 if (onDispose) {
36                     onDispose([keyToDispose, valueToDispose]);
37                 }
38             }
39             map.set(key, value);
40             return map;
41         },
42         get: (key: K) => {
43             const item = map.get(key);
44             if (!item) {
45                 return undefined;
46             }
47             map.delete(key);
48             map.set(key, item);
49             return item;
50         },
51     };
54 export default createLRU;