import { map, mergeMap, Observable, Subject } from 'rxjs'; /** * rx-signals internal helper type used by the {@link Store} * * @class DelayedEventQueue */ export class DelayedEventQueue { private queueArray: Subject[] = []; getQueueDelayedObservable(observable: Observable): Observable { return observable.pipe(mergeMap(value => this.fromDelayedQueue().pipe(map(() => value)))); } private fromDelayedQueue(): Observable { const subject = new Subject(); this.queueSubject(subject); return subject.asObservable(); } private queueSubject(subject: Subject): void { this.queueArray.push(subject); if (this.queueArray.length === 1) { this.signalNext(); } } private signalNext(): void { setTimeout(() => { const queueLength = this.queueArray.length; // eslint-disable-next-line no-plusplus for (let i = 0; i < queueLength; ++i) { this.queueArray[0].next(); this.queueArray.shift(); } if (this.queueArray.length > 0) { this.signalNext(); } }, 0); } } export default DelayedEventQueue;