この解答例はChatGPTによって生成されています,正しいかは自己判断で。
BFE.devでのAI解答例 - JavaScript コーディング問題
169. LRU - Chrome storage自動消去
以下は、LRUStorageの実装です。
class LRUStorage {
capacity: number;
data: Map<string, OriginData>;
timestamp: () => number;
constructor(capacity: number, timestamp: () => number = Date.now) {
this.capacity = capacity;
this.data = new Map();
this.timestamp = timestamp;
}
private evict(): void {
let oldestTime = Infinity;
let oldestOrigin = '';
for (const [origin, data] of this.data.entries()) {
if (data.persistent) {
continue;
}
if (data.lastUsed < oldestTime) {
oldestTime = data.lastUsed;
oldestOrigin = origin;
}
}
if (oldestOrigin) {
this.data.delete(oldestOrigin);
}
}
private touchData(origin: string): OriginData | undefined {
const data = this.data.get(origin);
if (!data) {
return data;
}
data.lastUsed = this.timestamp();
return data;
}
getData(origin: string): OriginData | undefined {
return this.touchData(origin);
}
setData(origin: string, size: number): boolean {
this.touchData(origin);
const oldData = this.data.get(origin);
if (oldData) {
this.data.set(origin, {
...oldData,
size,
lastUsed: this.timestamp()
});
return true;
} else {
if (this.capacity < size) {
return false;
}
while (this.capacity - size < this.totalSize()) {
this.evict();
}
this.data.set(origin, {
origin,
size,
lastUsed: this.timestamp(),
persistent: false
});
return true;
}
}
clearData(origin: string): void {
this.data.delete(origin);
}
makePersistent(origin: string): void {
const data = this.touchData(origin);
if (data) {
data.persistent = true;
}
}
totalSize(): number {
let total = 0;
for (const data of this.data.values()) {
total += data.size;
}
return total;
}
}
基本的には、Mapを使用し、データを格納します。そして、データに制限がかかった場合には、LRU (Least Recently Used) アルゴリズムを使用して、オリジンデータのスペースを開けます。
さらに、 getData
と setData
の呼び出し時にも、オリジンデータを最新のものにし、 getData
では、オリジンデータが存在しない場合 undefined
を返すようにしています。
最後に、 makePersistent
メソッドでは、データを永続にします。 永続的なデータは、特別にマークされ、LRUアルゴリズムによって削除されることはありません。
あなたのタイムスタンプ関数は、デフォルトで Date.now
を使用していますが、コンストラクタの二番目の引数として渡すことができます。この機能を使用することで、テスト中にタイムスタンプを固定することも可能です。