Skip to content

Commit

Permalink
update shift to pop
Browse files Browse the repository at this point in the history
reducing time complexity to `O(2n)`
  • Loading branch information
duncanista committed Mar 25, 2024
1 parent d7cfe43 commit 59d713d
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 6 deletions.
6 changes: 5 additions & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -279,8 +279,12 @@ export function sendDistributionMetric(name: string, value: number, ...tags: str
}

function sendQueueMetrics(listener: MetricsListener) {
// Reverse the queue to send metrics in order.
// This is necessary because the "queue" is a stack,
// and we want to send metrics in the order they were added.
_metricsQueue.reverse();
while (_metricsQueue.length > 0) {
const metric = _metricsQueue.shift()!; // This will always exist.
const metric = _metricsQueue.pop()!; // This will always exist.
const { name, value, metricTime, tags } = metric;
if (metricTime !== undefined) {
listener.sendDistributionMetricWithDate(name, value, metricTime, false, ...tags);
Expand Down
14 changes: 11 additions & 3 deletions src/metrics/queue.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,20 +37,28 @@ describe("MetricsQueue", () => {
});
});

describe("shift", () => {
describe("pop", () => {
it("returns undefined when queue is empty", () => {
const queue = new MetricsQueue();
expect(queue.shift()).toBeUndefined();
expect(queue.pop()).toBeUndefined();
});

it("returns the first element in the queue", () => {
const queue = new MetricsQueue();
queue.push({ name: "metric", tags: [], value: 1 });
queue.push({ name: "metric", tags: [], value: 2 });
expect(queue.shift()).toEqual({ name: "metric", tags: [], value: 1 });
expect(queue.pop()).toEqual({ name: "metric", tags: [], value: 2 });
});
});

it("reverses the queue", () => {
const queue = new MetricsQueue();
queue.push({ name: "metric", tags: [], value: 1 });
queue.push({ name: "metric", tags: [], value: 2 });
queue.reverse();
expect(queue.pop()).toEqual({ name: "metric", tags: [], value: 1 });
});

it("resets the queue", () => {
const queue = new MetricsQueue();
queue.push({ name: "metric", tags: [], value: 1 });
Expand Down
8 changes: 6 additions & 2 deletions src/metrics/queue.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,18 @@ export class MetricsQueue {
this.queue.push(metric);
}

public shift() {
public pop() {
if (this.queue.length > 0) {
return this.queue.shift();
return this.queue.pop();
}

return undefined;
}

public reverse() {
this.queue.reverse();
}

public reset() {
this.queue = [];
}
Expand Down

0 comments on commit 59d713d

Please sign in to comment.