UNPKG

@fbltd/async

Version:

Miscellaneous async utils

35 lines (34 loc) 938 B
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(); }; }