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
JavaScript
;
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);
//