Carbon/src/js/store/Subscribable.js

46 lines
1.0 KiB
JavaScript

class Subscribable {
constructor() {
this.events = {
addSelf: [],
editSelf: [],
removeSelf: [],
changeSelf: [],
};
this.eventDeps = {
addSelf: ["changeSelf"],
editSelf: ["changeSelf"],
removeSelf: ["changeSelf"],
changeSelf: [],
};
}
subscribe(event, callback) {
if (this.events[event]) {
this.events[event].push(callback);
} else {
throw new Error(
`Cannot subscribe to non-existent event ${event}, available events are: ${Object.keys(
this.events
).join(", ")}`
);
}
}
unsubscribe(event, callback) {
const index = this.events[event].indexOf(callback);
if (index === -1)
throw new Error(
`Tried to remove a nonexisting subscription from event ${event}`
);
this.events[event].splice(index, 1);
}
broadcast(event, data) {
this.eventDeps[event].concat(event).forEach((eventName) => {
this.events[eventName].forEach((f) => f(event, data));
});
}
}
export { Subscribable };