janus
Version:
the two-faced application library-framework
153 lines (140 loc) • 4.78 kB
JavaScript
// 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);