json-prism
Version:
Immutable Prisms, i.e. Taking a Multifoci Json Path to Immutability, or A sentient item has some ability to communicate, either by sharing its emotions, broadcasting its thoughts telepathically, or speaking aloud.
268 lines (232 loc) • 8.13 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var jp = require('jsonpath/jsonpath.min');
var F = require('functional-pipelines');
var _require = require('json-atom'),
get = _require.get,
set = _require.set;
var _require2 = require('./SentientBatch'),
MultiWriter = _require2.MultiWriter;
var uuidV4 = require('uuid/v4');
var _require3 = require('../../utils/json-path'),
stringify = _require3.stringify;
var _require4 = require('../../utils/trace'),
show = _require4.show,
aLine = _require4.aLine;
var Shredder_Mode_Actors = {
// @TODO NOTICE having the parameter called toString had some unusual behavior with jest test, toString was invoked by some other piece of code!!!
nodes: function nodes() {
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref$toStringFn = _ref.toStringFn,
toStringFn = _ref$toStringFn === void 0 ? stringify : _ref$toStringFn;
return function (_ref2) {
var path = _ref2.path,
value = _ref2.value;
return {
path: toStringFn(path),
value: value
};
};
},
pairs: function pairs() {
var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref3$toStringFn = _ref3.toStringFn,
toStringFn = _ref3$toStringFn === void 0 ? stringify : _ref3$toStringFn;
return function (_ref4) {
var path = _ref4.path,
value = _ref4.value;
return [toStringFn(path), value];
};
},
paths: function paths() {
var _ref5 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref5$toStringFn = _ref5.toStringFn,
toStringFn = _ref5$toStringFn === void 0 ? stringify : _ref5$toStringFn;
return function (x) {
return toStringFn(x.path);
};
},
values: function values() {
return function (x) {
return x.value;
};
}
};
var orderBy = function orderBy(key, order) {
var _ref6 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
_ref6$xf = _ref6.xf,
xf = _ref6$xf === void 0 ? function (x) {
return x;
} : _ref6$xf;
var compareFunction;
if (['asc', 'node-leaf-groups'].includes(order)) {
compareFunction = function compareFunction(a, b) {
return +(xf(a[key]) > xf(b[key])) || +(xf(a[key]) === xf(b[key])) - 1;
};
} else if (['desc', 'leaf-node-groups'].includes(order)) {
compareFunction = function compareFunction(a, b) {
return +(xf(b[key]) > xf(a[key])) || +(xf(b[key]) === xf(a[key])) - 1;
};
}
return compareFunction; // undefined triggers built-int array sort, which is idea for stringified paths or natural values
};
var shredder = function shredder(document) {
var _ref7 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
_ref7$modes = _ref7.modes,
modes = _ref7$modes === void 0 ? ['nodes'] : _ref7$modes,
_ref7$order = _ref7.order,
order = _ref7$order === void 0 ? 'node-leaf-groups' : _ref7$order;
var nodes = jp.nodes(document, '$..*');
show(nodes);
nodes = nodes.sort(orderBy('path', order, {
xf: function xf(ps) {
return ps.join('.');
}
}));
show(nodes);
nodes = nodes.map(Shredder_Mode_Actors['nodes']());
show(nodes); // @TODO: investigate other sorting semantics, like bfs and dfs
return modes.reduce(function (acc, mode) {
var compareFunction = Unshredder_Mode_Atom_Actors[mode] !== undefined ? orderBy(Unshredder_Mode_Atom_Actors[mode].orderKey, order) : undefined;
acc[mode] = nodes.map(Shredder_Mode_Actors[mode]()); //.sort(compareFunction);
return acc;
}, {});
};
var Unshredder_Mode_Atom_Actors = {
nodes: {
unit: function unit() {
return {};
},
reducer: function reducer(acc, _ref8) {
var path = _ref8.path,
value = _ref8.value;
show(path, ':=', value);
acc = set(path)(value)(acc);
return acc;
},
orderKey: 'path'
},
pairs: {
unit: function unit() {
return {};
},
reducer: function reducer(acc, _ref9) {
var _ref10 = (0, _slicedToArray2["default"])(_ref9, 2),
path = _ref10[0],
value = _ref10[1];
show(path, ':=', value);
acc = set(path)(value)(acc);
return acc;
},
orderKey: 0
}
};
var Unshredder_Mode_SentientBatch_Actors = {
nodes: {
unit: function unit() {
return {};
},
reducer: function reducer(acc, _ref11) {
var path = _ref11.path,
value = _ref11.value;
show(path, ':=', value);
acc = set(path)(value)(acc);
return acc;
},
orderKey: 'path',
keyFrom: function keyFrom(_ref12) {
var path = _ref12.path;
return path;
},
valueFrom: function valueFrom(_ref13) {
var value = _ref13.value;
return value;
}
},
pairs: {
unit: function unit() {
return {};
},
reducer: function reducer(acc, _ref14) {
var _ref15 = (0, _slicedToArray2["default"])(_ref14, 2),
path = _ref15[0],
value = _ref15[1];
show(path, ':=', value);
acc = set(path)(value)(acc);
return acc;
},
orderKey: 0,
keyFrom: function keyFrom(_ref16) {
var _ref17 = (0, _slicedToArray2["default"])(_ref16, 1),
path = _ref17[0];
return path;
},
valueFrom: function valueFrom(_ref18) {
var _ref19 = (0, _slicedToArray2["default"])(_ref18, 2),
_ = _ref19[0],
value = _ref19[1];
return value;
}
}
};
var unshredder = function unshredder() {
var _ref20 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
nodes = _ref20.nodes,
pairs = _ref20.pairs;
var _ref21 = nodes ? {
entries: nodes,
mode: 'nodes'
} : {
entries: pairs,
mode: 'pairs'
},
entries = _ref21.entries,
mode = _ref21.mode; // give priority to nodes if both are passed in
var _Unshredder_Mode_Atom = Unshredder_Mode_Atom_Actors[mode],
initFn = _Unshredder_Mode_Atom.unit,
reducingFn = _Unshredder_Mode_Atom.reducer;
show(mode, Unshredder_Mode_Atom_Actors[mode]);
show(initFn, reducingFn);
return F.reduce(reducingFn, initFn, entries.slice().sort(orderBy(Unshredder_Mode_Atom_Actors[mode].orderKey, 'node-leaf-groups')));
};
var Unprism = function Unprism(subject) {
var _ref22 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
_ref22$labels = _ref22.labels,
labels = _ref22$labels === void 0 ? [uuidV4()] : _ref22$labels;
return function () {
var _ref23 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
nodes = _ref23.nodes,
pairs = _ref23.pairs,
_ref23$withoutKeys = _ref23.withoutKeys,
withoutKeys = _ref23$withoutKeys === void 0 ? [] : _ref23$withoutKeys,
_ref23$sortUpdates = _ref23.sortUpdates,
sortUpdates = _ref23$sortUpdates === void 0 ? true : _ref23$sortUpdates;
var _ref24 = nodes ? {
entries: nodes,
mode: 'nodes'
} : {
entries: pairs,
mode: 'pairs'
},
entries = _ref24.entries,
mode = _ref24.mode; // give priority to nodes if both are passed in
var sortedEntries = sortUpdates ? entries.slice().sort(orderBy(Unshredder_Mode_SentientBatch_Actors[mode].orderKey, 'node-leaf-groups')) : entries.slice();
var sortedKeys = sortedEntries.map(Unshredder_Mode_SentientBatch_Actors[mode].keyFrom);
var sortedValues = sortedEntries.map(Unshredder_Mode_SentientBatch_Actors[mode].valueFrom);
var multiWriter = MultiWriter(subject, {
labels: labels
})(sortedKeys);
return {
value: multiWriter.updates(sortedValues).value,
multiWriter: multiWriter
};
};
};
module.exports = {
shredder: shredder,
Shredder_Mode_Actors: Shredder_Mode_Actors,
unshredder: unshredder,
Unshredder_Mode_Atom_Actors: Unshredder_Mode_Atom_Actors,
Unprism: Unprism
};