Optimize the append method to check if the data is already sorted

This commit is contained in:
2025-07-02 18:43:41 -04:00
parent db506e8b1f
commit 220b402b3b
2 changed files with 33 additions and 3 deletions

View File

@@ -38,6 +38,9 @@ export class CircularQueue<T> {
return;
}
const lastItem = this.get(this._size - 1);
const isAlreadyInOrder = lastItem && sortingCallback(lastItem, data) <= 0;
if (this._size < this._capacity) {
this.endIndex = (this.endIndex + 1) % this._capacity;
this._data[this.endIndex] = data;
@@ -48,7 +51,9 @@ export class CircularQueue<T> {
this._data[this.endIndex] = data;
}
this.sortData(sortingCallback);
if (!isAlreadyInOrder) {
this.sortData(sortingCallback);
}
}
popFront = () => {

View File

@@ -69,6 +69,31 @@ describe("CircularQueue", () => {
expect(queue.size()).toBe(1);
expect(queue.get(0)).toEqual(testItems.test);
});
it("optimizes append when items are already in order", () => {
const queue = new CircularQueue<TestItem>(5);
let sortCallCount = 0;
const trackingSortCallback = (a: TestItem, b: TestItem) => {
sortCallCount++;
return a.id - b.id;
};
queue.appendWithSorting(testItems.first, trackingSortCallback);
expect(sortCallCount).toBe(0);
queue.appendWithSorting(testItems.second, trackingSortCallback);
expect(sortCallCount).toBe(1);
queue.appendWithSorting(testItems.third, trackingSortCallback);
expect(sortCallCount).toBe(2);
queue.appendWithSorting({ id: 0, value: "zero" }, trackingSortCallback);
expect(sortCallCount).toBeGreaterThan(3);
expect(queue.get(0)).toEqual({ id: 0, value: "zero" });
expect(queue.get(1)).toEqual(testItems.first);
});
});
describe("popFront", () => {