diff --git a/speaker.js b/speaker.js new file mode 100644 index 0000000..b8102a7 --- /dev/null +++ b/speaker.js @@ -0,0 +1,37 @@ +class Speaker { + #callbacks = new Set() + #immediate + #scheduled = [] + + constructor(immediate) { + this.#immediate = immediate + } + + listen(callback) { + this.#callbacks.add(callback) + } + + speak(...args) { + if (this.#immediate) { + for (let callback of this.#callbacks) { + callback(...args) + } + } else { + if (!this.#scheduled.length) { + queueMicrotask(() => { + for (let callback of this.#callbacks) { + callback(...args) + } + this.#scheduled = [] + }) + } + this.#scheduled.push(args) + } + } + + silence(callback) { + this.#callbacks.delete(callbacks) + } +} + +export default Speaker