JSFiddle - React, Tailwind, and code Playground

JavaScript

var go = {};

(function () {
    function extend(_super, sub) {
        for (var k in _super) {
            if (_super.hasOwnProperty(k)) {
                sub[k] = _super[k];
            }
        }
    }
    go.extend = extend;
})();

// subscribable
(function () {
    var subscribable = {
        _subscriptions: [],
        subscribe: function (callback, callbackTarget) {
            var _subscribable = this;
            var subscription = {
                callback: callback.bind(callbackTarget),
                dispose: function () {
                    for (var i = 0; i < _subscribable._subscriptions.length; i++) {
                        if (_subscribable._subscriptions[i] === this) {
                            _subscribable._subscriptions.splice(i, 1);
                            break;
                        }
                    }
                }
            };
            this._subscriptions.push(subscription);
            return subscription;
        },
        notifySubscripters: function (valueToNotify) {
            go.dependencyDetection.begin();
            var _subscriptions = this._subscriptions.slice(0);
            for (var i = 0; i < _subscriptions.length; i++) {
                var subscription = _subscriptions[i];
                subscription.callback(valueToNotify);
            }
            go.dependencyDetection.end();
        }
    };
    go.subscribable = subscribable;
})();

// observable
(function () {
    var observable = function (initialValue) {
        var lastValue = initialValue;

        function observable() {
            if (arguments.length > 0) {
                // write
                var newValue = arguments[0];
                if (newValue !== lastValue) {
                    lastValue = newValue;
                    observable.notifySubscripters(lastValue);
                }
            } else {
                // read
                go.dependencyDetection.registerDependency(observable);
                return...