UNPKG

janus

Version:

the two-faced application library-framework

153 lines (140 loc) 4.78 kB
// Generated by CoffeeScript 1.12.2 (function() { var DerivedList, UniqList, extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, hasProp = {}.hasOwnProperty; DerivedList = require('../list').DerivedList; UniqList = (function(superClass) { extend(UniqList, superClass); function UniqList(parent) { var elem, i, idx, len, ref; this.parent = parent; UniqList.__super__.constructor.call(this); this.firsts = new Map(); this._vlen = 0; ref = this.parent.list; for (idx = i = 0, len = ref.length; i < len; idx = ++i) { elem = ref[idx]; this._tryAdd(elem, idx); } this.listenTo(this.parent, 'added', (function(_this) { return function(elem, idx) { return _this._tryAdd(elem, idx); }; })(this)); this.listenTo(this.parent, 'removed', (function(_this) { return function(elem, idx) { return _this._tryRemove(elem, idx); }; })(this)); this.listenTo(this.parent, 'moved', (function(_this) { return function(elem, toIdx, fromIdx) { return _this._tryMove(elem, toIdx, fromIdx); }; })(this)); } UniqList.prototype._tryAdd = function(elem, parentNewIdx) { var firsts, i, idx, isAppend, len, parentFirstIdx, ref, x; isAppend = parentNewIdx === this._vlen++; firsts = this.firsts; if (!isAppend) { firsts.forEach(function(idx, k) { if (idx >= parentNewIdx) { return firsts.set(k, idx + 1); } }); } if ((parentFirstIdx = firsts.get(elem)) != null) { if (parentNewIdx < parentFirstIdx) { this._moveEarlier(elem, parentNewIdx); } } else { firsts.set(elem, parentNewIdx); if (isAppend) { this._add(elem); } else { ref = this.list; for (idx = i = 0, len = ref.length; i < len; idx = ++i) { x = ref[idx]; if (firsts.get(x) > parentNewIdx) { return this._add(elem, idx); } } } } }; UniqList.prototype._tryRemove = function(elem, parentRmIdx) { var firsts, isUnappend; isUnappend = parentRmIdx === --this._vlen; firsts = this.firsts; if (!isUnappend) { firsts.forEach(function(idx, k) { if (idx > parentRmIdx) { return firsts.set(k, idx - 1); } }); } if (parentRmIdx > firsts.get(elem)) { return; } else if (this.parent.list.indexOf(elem) >= 0) { this._moveLater(elem); } else { firsts["delete"](elem); this._removeAt(this.list.indexOf(elem)); } }; UniqList.prototype._tryMove = function(elem, parentToIdx, parentFromIdx) { var firsts, parentFirstIdx; firsts = this.firsts; parentFirstIdx = firsts.get(elem); if (parentFromIdx < parentToIdx) { firsts.forEach(function(idx, k) { if ((parentFromIdx < idx && idx <= parentToIdx)) { return firsts.set(k, idx - 1); } }); } else { firsts.forEach(function(idx, k) { if ((parentToIdx <= idx && idx < parentFromIdx)) { return firsts.set(k, idx + 1); } }); } if (parentFirstIdx < parentFromIdx && parentFirstIdx < parentToIdx) { return; } else if (parentToIdx < parentFirstIdx) { this._moveEarlier(elem, parentToIdx); } else { this._moveLater(elem); } }; UniqList.prototype._moveEarlier = function(elem, parentIdx) { var i, idx, len, ref, x; this.firsts.set(elem, parentIdx); ref = this.list; for (idx = i = 0, len = ref.length; i < len; idx = ++i) { x = ref[idx]; if (this.firsts.get(x) > parentIdx) { return this._moveAt(this.list.indexOf(elem), idx); } } }; UniqList.prototype._moveLater = function(elem) { var i, idx, len, parentIdx, ref, x; parentIdx = this.parent.list.indexOf(elem); this.firsts.set(elem, parentIdx); ref = this.list; for (idx = i = 0, len = ref.length; i < len; idx = ++i) { x = ref[idx]; if (this.firsts.get(x) > parentIdx) { return this._moveAt(this.list.indexOf(elem), idx - 1); } } this._moveAt(this.list.indexOf(elem), this.list.length - 1); }; return UniqList; })(DerivedList); module.exports = { UniqList: UniqList }; }).call(this);