let PubSub = ()=>{ // state: let subscriptions_by_event = {}; // by event name, that is let subscriptions_by_name = {}; // subscriptions can be named, for easy unsubscribing // methods: let pub = (e, ...params)=>{ if(subscriptions_by_event[e]){ subscriptions_by_event[e].forEach(subscription=>subscription.cb(...params)) } }; let sub = (e, cb, name)=>{ // 'name' is for unsubbing if(typeof subscriptions_by_event[e] === 'undefined'){ subscriptions_by_event[e] = []; } let subscription = { e, cb, name: name || '' }; subscriptions_by_event[e].push(subscription); if(subscription.name !== ''){ if(typeof subscriptions_by_name[name] !== 'undefined'){ console.warn('Already subscription with name "'+name+'". Overwriting nonetheless.'); } subscriptions_by_name[name] = subscription; } }; let unsub = (name)=>{ // check if such a named subscription exists: if(typeof subscriptions_by_name[name] !== 'undefined'){ // get ref to subscription object for later: let subscription = subscriptions_by_name[name]; // delete subscription from both lists: subscriptions_by_event[subscription.e].splice(subscriptions_by_event[subscription.e].indexOf(subscription), 1); delete subscriptions_by_name[name]; } }; return {pub, sub, unsub}; } export default PubSub;