@benev/slate
Version:
frontend web stuff
38 lines • 946 B
JavaScript
import { deferPromise } from "./defer-promise.js";
/**
* simple pub-sub mechanism.
*
* // create pubsub function
* const onCount = pubsub<[string, number]>()
*
* // subscribe
* const stop = onCount((a, b) => console.log(a, b))
*
* // publish
* onWhatever.publish("count", 123)
*
* // unsubscribe
* stop()
*
*/
export function pubsub() {
const set = new Set();
function subscribe(fn) {
set.add(fn);
return () => { set.delete(fn); };
}
subscribe.publish = async (...a) => {
await Promise.all([...set].map(fn => fn(...a)));
};
subscribe.clear = () => set.clear();
subscribe.once = async () => {
const { promise, resolve } = deferPromise();
const unsubscribe = subscribe((...a) => {
resolve(a);
unsubscribe();
});
return promise;
};
return subscribe;
}
//# sourceMappingURL=pubsub.js.map