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.

114 lines (98 loc) 4.06 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _require = require('rxjs'), BehaviorSubject = _require.BehaviorSubject, ReplaySubject = _require.ReplaySubject, Subject = _require.Subject; var _require2 = require('json-atom'), get = _require2.get, set = _require2.set, apply = _require2.apply; var _require3 = require('../../utils/trace'), show = _require3.show, aLine = _require3.aLine; var _require4 = require('./version/generator'), incrementalVersioner = _require4.incrementalVersioner; var uuidV4 = require('uuid/v4'); var Writer = function Writer(subject) { var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$labels = _ref.labels, labels = _ref$labels === void 0 ? [uuidV4()] : _ref$labels; var startValue = { type: 'SnapShot', payload: subject.value }; var ___init___ = true; var versionBy = incrementalVersioner(); //@TODO: injectable versionProvider, otherwise every Writer is versioned independently var versionNext = function versionNext() { var _versionBy$next = versionBy.next(), done = _versionBy$next.done, value = _versionBy$next.value; if (done) throw new Error('Version Generator Completed. Can not get next version value.'); return value; }; var _new = function _new(stream$) { return { gets: function gets(url) { show('<', url, stream$.value.value); return get(url)(stream$.value.value); }, sets: function sets(url) { return function (value) { show(">* ".concat(url, " current:"), stream$.value.value); // LOoOK_OvEr_hErE @TODO: NOTICE HOW THE SHADES.SET FOUND MY get(), THAT'S A PORTAL BACK INTO SHADES, // RENAMING to gets/sets changed the behavior var newValue = set(url)(value)(stream$.value.value); show('newValue:', (0, _typeof2["default"])(newValue), newValue); // new values are all assumed to be JSON compliant documents, meaning, the root gotta be a tree, end of discussion. var newWriter = Object.assign(new newValue.constructor(), { value: newValue, path: url, action: 'set', version: versionNext(), // @TODO a hashing-versioner can get the newValue passed into versionNext() to help version by digests and md5 hashes labels: labels }, _new(stream$)); stream$.next(newWriter); return newWriter; }; } }; }; return _new(subject); }; module.exports = { Writer: Writer }; // const journal = new BehaviorSubject({}); // journal.subscribe(entry => show('+JournalEntry', ++clicks, entry, entry.gets ? entry.gets('$.hello') : 'NO .gets')); // show('JOURNAL-VALUE:', journal.value); // show(Writer(journal).gets('$.hello')); // show(get('$.hello')(journal.value)); // const returns = Writer(journal).sets('$.hello')('RP'); // show({returns}); // show('JOURNAL-VALUE:', journal.value); // show(Writer(journal).gets('$.hello')); // show(get('$.hello')(journal.value)); // show('JOURNAL-VALUE:', journal.value); // show(aLine(100)); // show(aLine(100)); // show(Writer(journal) // .sets('$.bye')('Bad Code') // // .get('bye') // ); // show('JOURNAL-VALUE:', journal.value); // journal.value.sets('$.journaledPost')({"timestamp":"2019-05-17T18:11:29.344Z","author":"Shady Dawood"}); // // const atom = journal.value; // show(atom.gets('$.hello')); // show(atom.gets('$.bye')); // show(atom.gets('$.journaledPost')); // show('JOURNAL-VALUE:', journal.value); // show(atom.sets('$.hello')('New World')); // show(atom.sets('$.bye')('Old World')); // show(atom.sets('$.journaledPost')({"timestamp":"2019-05-17T18:14:50.344Z","author":"Shady Dawood"})); // show('JOURNAL-VALUE:', journal.value); // show(atom.gets('$.hello')); // show(atom.gets('$.bye')); // show(atom.gets('$.journaledPost')); // show('JOURNAL-VALUE:', journal.value); //