lik/ts/backpressuredarray.ts

48 lines
1.1 KiB
TypeScript
Raw Normal View History

2023-11-13 13:40:01 +00:00
import * as plugins from './lik.plugins.js';
export class BackpressuredArray<T> {
private data: T[];
private highWaterMark: number;
public hasSpace: plugins.smartrx.rxjs.Subject<void>;
constructor(highWaterMark: number = 16) {
this.data = [];
this.highWaterMark = highWaterMark;
this.hasSpace = new plugins.smartrx.rxjs.Subject<void>();
}
push(item: T): boolean {
this.data.push(item);
const spaceAvailable = this.checkSpaceAvailable();
if (spaceAvailable) {
this.hasSpace.next();
}
return spaceAvailable
}
shift(): T | undefined {
const item = this.data.shift();
if (this.checkSpaceAvailable()) {
this.hasSpace.next();
}
return item;
}
checkSpaceAvailable(): boolean {
return this.data.length < this.highWaterMark;
}
2023-11-13 13:59:03 +00:00
waitForSpace(): Promise<void> {
return new Promise<void>((resolve) => {
if (this.checkSpaceAvailable()) {
resolve();
} else {
const subscription = this.hasSpace.subscribe(() => {
subscription.unsubscribe();
resolve();
});
}
});
}
2023-11-13 13:40:01 +00:00
}