Skip to content

Commit 59d713d

Browse files
committed
update shift to pop
reducing time complexity to `O(2n)`
1 parent d7cfe43 commit 59d713d

File tree

3 files changed

+22
-6
lines changed

3 files changed

+22
-6
lines changed

src/index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,8 +279,12 @@ export function sendDistributionMetric(name: string, value: number, ...tags: str
279279
}
280280

281281
function sendQueueMetrics(listener: MetricsListener) {
282+
// Reverse the queue to send metrics in order.
283+
// This is necessary because the "queue" is a stack,
284+
// and we want to send metrics in the order they were added.
285+
_metricsQueue.reverse();
282286
while (_metricsQueue.length > 0) {
283-
const metric = _metricsQueue.shift()!; // This will always exist.
287+
const metric = _metricsQueue.pop()!; // This will always exist.
284288
const { name, value, metricTime, tags } = metric;
285289
if (metricTime !== undefined) {
286290
listener.sendDistributionMetricWithDate(name, value, metricTime, false, ...tags);

src/metrics/queue.spec.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,20 +37,28 @@ describe("MetricsQueue", () => {
3737
});
3838
});
3939

40-
describe("shift", () => {
40+
describe("pop", () => {
4141
it("returns undefined when queue is empty", () => {
4242
const queue = new MetricsQueue();
43-
expect(queue.shift()).toBeUndefined();
43+
expect(queue.pop()).toBeUndefined();
4444
});
4545

4646
it("returns the first element in the queue", () => {
4747
const queue = new MetricsQueue();
4848
queue.push({ name: "metric", tags: [], value: 1 });
4949
queue.push({ name: "metric", tags: [], value: 2 });
50-
expect(queue.shift()).toEqual({ name: "metric", tags: [], value: 1 });
50+
expect(queue.pop()).toEqual({ name: "metric", tags: [], value: 2 });
5151
});
5252
});
5353

54+
it("reverses the queue", () => {
55+
const queue = new MetricsQueue();
56+
queue.push({ name: "metric", tags: [], value: 1 });
57+
queue.push({ name: "metric", tags: [], value: 2 });
58+
queue.reverse();
59+
expect(queue.pop()).toEqual({ name: "metric", tags: [], value: 1 });
60+
});
61+
5462
it("resets the queue", () => {
5563
const queue = new MetricsQueue();
5664
queue.push({ name: "metric", tags: [], value: 1 });

src/metrics/queue.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,18 @@ export class MetricsQueue {
3636
this.queue.push(metric);
3737
}
3838

39-
public shift() {
39+
public pop() {
4040
if (this.queue.length > 0) {
41-
return this.queue.shift();
41+
return this.queue.pop();
4242
}
4343

4444
return undefined;
4545
}
4646

47+
public reverse() {
48+
this.queue.reverse();
49+
}
50+
4751
public reset() {
4852
this.queue = [];
4953
}

0 commit comments

Comments
 (0)