@sema-agent/core
Version:
Stateless, task-oriented AI agent core
42 lines (41 loc) • 1.01 kB
JavaScript
export class PushQueue {
buffer = [];
waiters = [];
closed = false;
push(value) {
if (this.closed) {
return false;
}
const waiter = this.waiters.shift();
if (waiter) {
waiter({ value, done: false });
}
else {
this.buffer.push(value);
}
return true;
}
close() {
this.closed = true;
while (this.waiters.length > 0) {
this.waiters.shift()({ value: undefined, done: true });
}
}
async *[Symbol.asyncIterator]() {
for (;;) {
if (this.buffer.length > 0) {
yield this.buffer.shift();
}
else if (this.closed) {
return;
}
else {
const r = await new Promise((resolve) => this.waiters.push(resolve));
if (r.done) {
return;
}
yield r.value;
}
}
}
}