var dispCbs = [];
var dispIns = [];

function Dispatcher() {
    dispIns.push(this);
    dispCbs.push({});
}

Dispatcher.prototype = {
    on(type, cb) {
        let cbtypes = dispCbs[dispIns.indexOf(this)];
        let cbs = cbtypes[type] = cbtypes[type] || [];
        if (!~cbs.indexOf(cb)) {
            cbs.push(cb);
        }
    },

    off(type, cb) {
        let cbtypes = dispCbs[dispIns.indexOf(this)];
        let cbs = cbtypes[type] = cbtypes[type] || [];
        let curTypeCbIdx = cbs.indexOf(cb);
        if (~curTypeCbIdx) {
            cbs.splice(curTypeCbIdx, 1);
        }
    },

    fire(type, ...args) {
        let cbtypes = dispCbs[dispIns.indexOf(this)];
        let cbs = cbtypes[type] = cbtypes[type] || [];

        for (let i = 0; i < cbs.length; i++) {
            cbs[i].apply(null, args);
        }
    }

};
module.exports = Dispatcher;
