export type Entry = { id: number }; export class Table { entries: TableEntry[] = []; autoIncrementId: number = 1; constructor(private saveCallback: () => Promise) {} private generateId(): number { return this.autoIncrementId++; } async insert(record: Omit) { const recordWithId = { ...record, id: this.generateId() } as TableEntry; this.entries.push(recordWithId); await this.saveCallback(); return recordWithId; } select(predicate: (entry: TableEntry) => boolean): TableEntry[] { return this.entries.filter(predicate); } async update( predicate: (entry: TableEntry) => boolean, updateFn: (entry: TableEntry) => void, ) { const updated: TableEntry[] = []; this.entries.forEach((record) => { if (predicate(record)) { updateFn(record); updated.push(record); } }); await this.saveCallback(); return updated; } async delete(predicate: (entry: TableEntry) => boolean) { const deletedEntries = this.entries.filter(predicate); this.entries = this.entries.filter((record) => !predicate(record)); await this.saveCallback(); return deletedEntries; } }