five-bells-visualization
Version:
Tool to visualize Five Bells payments
119 lines (109 loc) • 3.31 kB
HTML
<!--
@license
Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
Code distributed by Google as part of the polymer project is also
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-->
<link rel="import" href="debounce.html">
<script>
(function() {
var callbacks = new WeakMap();
function observe(array, cb) {
if (Array.observe) {
var ncb = function(changes) {
changes = changes.filter(function(o) { return o.type == 'splice'; });
if (changes.length) {
cb(changes);
}
};
callbacks.set(cb, ncb);
Array.observe(array, ncb);
} else {
if (!array.__polymerObservable) {
makeObservable(array);
}
callbacks.get(array).push(cb);
}
}
function unobserve(array, cb) {
if (Array.observe) {
var ncb = callbacks.get(cb);
callbacks.delete(cb);
Array.unobserve(array, ncb);
} else {
var cbs = callbacks.get(array);
var idx = cbs.indexOf(cb);
if (idx >= 0) {
cbs.splice(idx, 1);
}
}
}
function makeObservable(array) {
var splices = [];
var debounce;
var orig = {
push: array.push,
pop: array.pop,
splice: array.splice,
shift: array.shift,
unshift: array.unshift,
sort: array.sort
};
var addSplice = function(index, added, removed) {
splices.push({
index: index,
addedCount: added,
removed: removed,
object: array,
type: 'splice'
});
};
callbacks.set(array, []);
array.push = function() {
debounce = Polymer.Debounce(debounce, fin);
addSplice(array.length, 1, []);
return orig.push.apply(this, arguments);
};
array.pop = function() {
debounce = Polymer.Debounce(debounce, fin);
addSplice(array.length - 1, 0, array.slice(-1));
return orig.pop.apply(this, arguments);
};
array.splice = function(start, deleteCount) {
debounce = Polymer.Debounce(debounce, fin);
addSplice(start, arguments.length - 2, array.slice(start, start + deleteCount));
return orig.splice.apply(this, arguments);
};
array.shift = function() {
debounce = Polymer.Debounce(debounce, fin);
addSplice(0, 0, [array[0]]);
return orig.shift.apply(this, arguments);
};
array.unshift = function() {
debounce = Polymer.Debounce(debounce, fin);
addSplice(0, 1, []);
return orig.unshift.apply(this, arguments);
};
array.sort = function() {
debounce = Polymer.Debounce(debounce, fin);
console.warn('[ArrayObserve]: sort not observable');
return orig.sort.apply(this, arguments);
};
var fin = function() {
var cbs = callbacks.get(array);
for (var i=0; i<cbs.length; i++) {
cbs[i](splices);
}
splices = [];
};
array.__polymerObservable = true;
}
Polymer.ArrayObserve = {
observe: observe,
unobserve: unobserve
};
})();
</script>