glass-platform
Version:
Glass platform
157 lines (139 loc) • 3.98 kB
JavaScript
(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
*/
})})()