UNPKG

five-bells-visualization

Version:
119 lines (109 loc) 3.31 kB
<!-- @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>