@fbltd/async
Version:
Miscellaneous async utils
35 lines (34 loc) • 938 B
JavaScript
import { isObjectsContentEqual } from "../utils.js";
import { raceStream } from "../../vanilla/index.js";
export class RaceStreamController {
_value;
isFirstWas = false;
rerenderTrigger;
deps;
iterator;
constructor(streams) {
this.deps = streams;
this.init();
}
get value() {
return this._value;
}
async init() {
this.iterator = raceStream(this.deps);
this._value = Object.entries(this.deps)
.reduce((acc, [key, dep]) => {
acc[key] = dep.value;
return acc;
}, {});
for await (let value of this.iterator) {
this.rerenderTrigger?.(prev => !prev);
if (!this.isFirstWas && !isObjectsContentEqual(this._value, value)) {
this._value = value;
}
this.isFirstWas = true;
}
}
dispose = () => {
this.iterator.dispose();
};
}