refer
Version:
redux-like library for handling global state on functional style
85 lines (72 loc) • 2.25 kB
JavaScript
;
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _types = require('./types');
var _mapValues = require('./mapValues');
var _mapValues2 = _interopRequireDefault(_mapValues);
var _constants = require('./constants');
var createDispatche = function createDispatche(table) {
if (!_types.isObj(table)) {
throw new Error('createDispatche(table): Expected table to be an object which is ' + table);
}
var dispatch = function dispatch(_x, _x2) {
var _again = true;
_function: while (_again) {
var key = _x,
value = _x2;
handler = undefined;
_again = false;
var handler = undefined;
switch (true) {
case key === null:
return value;
case key === undefined:
throw new Error('dispatch(key, value): Expected the key not to be undefined');
case key === _constants.GET_TABLE:
return table; // special key to get table
case _types.isStr(key) || _types.isNum(key):
handler = table[key];
break;
default:
handler = key;
}
switch (true) {
case handler == null:
return value;
case _types.isFn(handler):
return _types.isThenable(value) ? value.then(handler) : handler(value);
case _types.isStr(handler) || _types.isNum(handler):
_x = handler;
_x2 = value;
_again = true;
continue _function;
case _types.isArr(handler):
return dispatchOnList(handler, value);
case _types.isThenable(handler):
return handler.then(function (asyncHandler) {
return dispatch(asyncHandler, value);
});
case _types.isObj(handler):
return _mapValues2['default'](handler, function (item) {
return dispatch(item, value);
});
default:
return value;
}
}
};
var dispatchOnList = function dispatchOnList(handlers, value) {
for (var i = 0, len = handlers.length; i < len; i++) {
value = dispatch(handlers[i], value);
if (_types.isThenable(value)) {
return i === len - 1 ? value : value.then(function (result) {
return dispatch(handlers.slice(i + 1), result);
});
}
}
return value;
};
return dispatch;
};
exports['default'] = createDispatche;
module.exports = exports['default'];