JSFiddle - React, Tailwind, and code Playground

JavaScript

(function(window) {
    var token = 0,
        topics = {},
        Publisher, Subscriber,

        Subscription = function(topic, func) {
            this.token = token++;
            this.topic = topic;
            this.func = func;
        },

        pubsub = Object.create({
            subscribe: function(topic, func) {
                var sub = new Subscription(topic, func);

                topics[topic] = topics[topic] || [];
                topics[topic].push(sub);

                return sub;
            },
            subscribe_once: function(topic, func) {
                var sub = pubsub.subscribe(topic, func),
                    old_func = sub.func;

                // rewrite our subscription's method to remove itself after invocation
                sub.func = function() {
                    // call the original function
                    old_func.apply(this);
                    // remove subscription from topic
                    pubsub.unsubscribe(sub);
                };

                return sub;
            },
            unsubscribe: function(subscription) {
                console.log('calling unsubscribe');
                // iterate through the topic to which the given subscription belongs,
                // when we find a match, return a list of subscriptions minus the match
                topics[subscription.topic] = _.reject(topics[subscription.topic], function(sub) {
                    return subscription.token === sub.token;
                });
            },
            publish: function(topic, context) {
                console.log('topics["someevent"] contains elements here', topics[topic]);
                console.log('but not here', topics);
                
                _.each(topics[topic], function(subscription) {
                    subscription.func.apply({
                        context: context
                    });
                });
            }
        });

    // these are basically interfaces
   ...