summaryrefslogtreecommitdiff
path: root/cli/js/streams/queue.ts
diff options
context:
space:
mode:
Diffstat (limited to 'cli/js/streams/queue.ts')
-rw-r--r--cli/js/streams/queue.ts65
1 files changed, 65 insertions, 0 deletions
diff --git a/cli/js/streams/queue.ts b/cli/js/streams/queue.ts
new file mode 100644
index 000000000..264851baf
--- /dev/null
+++ b/cli/js/streams/queue.ts
@@ -0,0 +1,65 @@
+// Forked from https://github.com/stardazed/sd-streams/tree/8928cf04b035fd02fb1340b7eb541c76be37e546
+// Copyright (c) 2018-Present by Arthur Langereis - @zenmumbler MIT
+
+/**
+ * streams/queue - simple queue type with chunked array backing
+ * Part of Stardazed
+ * (c) 2018-Present by Arthur Langereis - @zenmumbler
+ * https://github.com/stardazed/sd-streams
+ */
+
+const CHUNK_SIZE = 16384;
+
+export interface Queue<T> {
+ push(t: T): void;
+ shift(): T | undefined;
+ front(): T | undefined;
+ readonly length: number;
+}
+
+export class QueueImpl<T> implements Queue<T> {
+ private readonly chunks_: T[][];
+ private readChunk_: T[];
+ private writeChunk_: T[];
+ private length_: number;
+
+ constructor() {
+ this.chunks_ = [[]];
+ this.readChunk_ = this.writeChunk_ = this.chunks_[0];
+ this.length_ = 0;
+ }
+
+ push(t: T): void {
+ this.writeChunk_.push(t);
+ this.length_ += 1;
+ if (this.writeChunk_.length === CHUNK_SIZE) {
+ this.writeChunk_ = [];
+ this.chunks_.push(this.writeChunk_);
+ }
+ }
+
+ front(): T | undefined {
+ if (this.length_ === 0) {
+ return undefined;
+ }
+ return this.readChunk_[0];
+ }
+
+ shift(): T | undefined {
+ if (this.length_ === 0) {
+ return undefined;
+ }
+ const t = this.readChunk_.shift();
+
+ this.length_ -= 1;
+ if (this.readChunk_.length === 0 && this.readChunk_ !== this.writeChunk_) {
+ this.chunks_.shift();
+ this.readChunk_ = this.chunks_[0];
+ }
+ return t;
+ }
+
+ get length(): number {
+ return this.length_;
+ }
+}