export type ObserverCallback = (data: T) => void; export default class Observable { private subscriber: ObserverCallback[] = []; private events: T[] = []; private timeout = undefined; constructor(private collect: boolean = true, private collect_intervall: number = 100) { } getPublicApi() { return { subscribe: (callback: ObserverCallback) => { if (this.subscriber.indexOf(callback) < 0) this.subscriber.push(callback) }, unsubscribe: (callback: ObserverCallback) => { let idx = this.subscriber.indexOf(callback); if (idx >= 0) { this.subscriber.splice(idx, 1); } } } } send(data: T) { if (!this.collect) this.subscriber.forEach(e => e([data])); else { this.events.push(data); if (!this.timeout) { this.timeout = setTimeout(() => { this.subscriber.forEach(e => e(this.events)); this.timeout = 0; }, this.collect_intervall); } } } }