UNPKG

glass-platform

Version:

Glass platform

157 lines (139 loc) 3.98 kB
(function(){require.register('glass/patch',function(module,exports,require){// Generated by CoffeeScript 1.6.2 (function() { var apply, assert, canWatch, combine, exports, watch; require('./global'); apply = function(target, values, deleteUndefined) { var key, patchedValue, value; if (deleteUndefined == null) { deleteUndefined = true; } if ((values != null ? values.constructor : void 0) !== Object) { return Object.clone(values, true); } if ((target != null ? target.constructor : void 0) !== Object) { target = {}; } for (key in values) { value = values[key]; patchedValue = apply(target[key], value, deleteUndefined); if (value === void 0 && deleteUndefined) { delete target[key]; } else { target[key] = patchedValue; } } return target; }; combine = function(patch1, patch2) { return apply(patch1, patch2, false); }; canWatch = function(object) { return (object != null) && typeof object === 'object'; }; watch = function(object, handler, callInitial) { var pendingPatch, processPatch, subWatchers, watcher; if (callInitial == null) { callInitial = true; } if (!canWatch(object)) { throw new Error("Cannot watch: " + object); } subWatchers = {}; pendingPatch = null; processPatch = function(patchValues) { var name, value; for (name in patchValues) { if (typeof subWatchers[name] === "function") { subWatchers[name](); } value = object[name]; if (canWatch(value)) { (function() { var saveName, subHandler; saveName = name; subHandler = function(patch) { var basePatch; basePatch = {}; basePatch[saveName] = patch; if (pendingPatch != null) { return pendingPatch = combine(pendingPatch, basePatch); } else { return handler(basePatch); } }; return subWatchers[saveName] = watch(value, subHandler, false); })(); } } }; watcher = function(changes) { var change, _i, _len; pendingPatch = {}; for (_i = 0, _len = changes.length; _i < _len; _i++) { change = changes[_i]; pendingPatch[change.name] = object[change.name]; } processPatch(pendingPatch); return process.nextTick(function() { handler(pendingPatch); return pendingPatch = null; }); }; processPatch(object); Object.observe(object, watcher); return function() { var key, value, _results; Object.unobserve(object, watcher); _results = []; for (key in subWatchers) { value = subWatchers[key]; _results.push(value()); } return _results; }; }; module.exports = exports = { apply: apply, combine: combine, watch: watch }; if (typeof describe === 'function') { assert = require('assert'); describe('glass.patch', function() { return it('should work', function(done) { var source, target, unwatch; source = { name: 'Kris', age: 41, children: { Sadera: { grandchildren: { One: 1, Two: 2 } }, Orion: {} } }; target = Object.clone(source); unwatch = watch(source, function(patch) { target = apply(target, patch); assert(Object.equal(source, target)); done(); return unwatch(); }); source.name = 'Fred'; source.children.Orion = { a: 1, b: 2 }; source.children.Orion.c = 12; return source.children.Sadera.grandchildren.three = 3; }); }); } }).call(this); /* //@ sourceMappingURL=patch.map */ })})()