Observable

by AntonLapshin

JavaScript

var observable = (function(){

    var _subs = [];
    var _index = 0;

    function on(uid, handler){
        var hs = _subs[uid];
        if (!hs){
            hs = [];
            _subs[uid] = hs;
        }

        hs.push(handler);
    }

    function off(uid, handler){
        var hs = _subs[uid];
        if (!hs)
            return;

        var i = hs.indexOf(handler);
        hs.splice(i, 1);
    }

    function fire(uid, data, oldData){
        var hs = _subs[uid];
        if (!hs)
            return;

        hs.forEach(function(h){
            h(data, oldData);
        });
    }

    return function(data){
        var _data = data;
        var _uid = _index++;

        var Observable = function(data){
            if (data === undefined)
                return _data;

            var oldData = _data;
            _data = data;
            fire(_uid, data, oldData);
        };

        Observable.on = function(h){
        	on(_uid, h);
        };
        Observable.off = function(h){
        	off(_uid, h);
        }
        
        return Observable;
    };

})();

debugger;
var o1 = observable(5);
o1.on(function(v, ov){
	console.log(v + ' ' + ov);
});
console.log(o1());
o1(3);