UNPKG

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
"use strict"; 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 };