@stringsync/vexml
Version:
MusicXML to Vexflow
25 lines (24 loc) • 771 B
JavaScript
/** Class that tracks pubsub subscribers. */
export class Topic {
id = 0;
subscriptions = new Array();
hasSubscribers(name) {
return this.subscriptions.some((s) => s.name === name);
}
publish(name, payload) {
this.subscriptions.filter((s) => s.name === name).forEach((s) => s.listener(payload));
}
subscribe(name, listener) {
const id = this.id++;
this.subscriptions.push({ id, name, listener: listener });
return id;
}
unsubscribe(id) {
const subscription = this.subscriptions.find((s) => s.id === id) ?? null;
this.subscriptions = this.subscriptions.filter((s) => s.id !== id);
return subscription;
}
unsubscribeAll() {
this.subscriptions = [];
}
}