state-trooper
Version:
Application State Manager
133 lines (95 loc) • 3.88 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', {
value: true
});
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _underscore = require('underscore');
var _convert_to_native = require('./convert_to_native');
var _convert_to_native2 = _interopRequireDefault(_convert_to_native);
var _immutable = require('immutable');
var _immutable2 = _interopRequireDefault(_immutable);
var _put_on_chan = require('./put_on_chan');
var _put_on_chan2 = _interopRequireDefault(_put_on_chan);
function hasSameValue(valueA, cursorB) {
return isEqual(valueA, _immutable2['default'].fromJS(cursorB.deref()));
}
function isEqual(valueA, valueB) {
if (valueA) {
return _immutable2['default'].is(valueA, valueB);
} else {
return valueA === valueB;
}
}
function deref(value) {
return value;
}
var derefJS = (0, _underscore.memoize)(_convert_to_native2['default'], function (value) {
return (0, _underscore.isEmpty)(value) || typeof value.hashCode !== 'function' ? value : value.hashCode();
});
// mutations and data store interactions
function replace(ch, path, value) {
var callback = arguments.length <= 3 || arguments[3] === undefined ? null : arguments[3];
update(ch, { path: path, value: _immutable2['default'].fromJS(value), action: 'replace', callback: callback });
}
function set(ch, path, value) {
var callback = arguments.length <= 3 || arguments[3] === undefined ? null : arguments[3];
update(ch, { path: path, value: _immutable2['default'].fromJS(value), action: 'set', callback: callback });
}
function add(ch, path, value) {
var callback = arguments.length <= 3 || arguments[3] === undefined ? null : arguments[3];
update(ch, { path: path, value: _immutable2['default'].fromJS(value), action: 'add', callback: callback });
}
function remove(ch, path, value) {
var callback = arguments.length <= 3 || arguments[3] === undefined ? null : arguments[3];
update(ch, { path: path, value: value, action: 'remove', callback: callback });
}
function persist(ch, path) {
update(ch, { path: path, value: null, action: 'persist' });
}
function fetch(ch, path) {
update(ch, { path: path, value: null, action: 'fetch' });
}
function update(ch, change) {
(0, _put_on_chan2['default'])(ch, change);
}
// refining
function refine(value, updateCh, oldPath, newPath) {
var newPathArr = (0, _underscore.isArray)(newPath) ? newPath : newPath.toString().split('.');
var refinedValue = value.getIn(newPathArr);
var refinedPath = oldPath.concat(newPathArr);
return cursor(refinedValue, refinedPath, updateCh);
}
// array helpers
function cMap(value, mapper) {
return value.map(function (v, i) {
return mapper(cursor.refine(i), i);
});
}
var cursor = function cursor(value, path, updateCh) {
var imVal = _immutable2['default'].fromJS(value);
var o = {
deref: (0, _underscore.partial)(deref, imVal),
derefJS: (0, _underscore.partial)(derefJS, imVal),
path: path,
replace: (0, _underscore.partial)(replace, updateCh, path),
remove: (0, _underscore.partial)(remove, updateCh, path, imVal),
refine: (0, _underscore.partial)(refine, imVal, updateCh, path),
persist: (0, _underscore.partial)(persist, updateCh, path),
fetch: (0, _underscore.partial)(fetch, updateCh, path),
hasSameValue: (0, _underscore.partial)(hasSameValue, imVal)
};
Object.defineProperty(o, "value", {
get: (0, _underscore.partial)(derefJS, imVal)
});
if (_immutable2['default'].List.isList(imVal)) {
// array specific operations
o.map = (0, _underscore.partial)(cMap, imVal);
o.add = (0, _underscore.partial)(add, updateCh, path);
}
if (_immutable2['default'].Map.isMap(imVal)) {
o.set = (0, _underscore.partial)(set, updateCh, path);
}
return o;
};
exports['default'] = cursor;
module.exports = exports['default'];