ember-app-scheduler
Version:
Ember addon to schedule work at different phases of app life cycle.
197 lines (165 loc) • 16.7 kB
JavaScript
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
export var ListNode = function ListNode(value) {
_classCallCheck(this, ListNode);
this.next = null;
this.prev = null;
this.value = value;
};
export var LinkedList = function () {
function LinkedList() {
_classCallCheck(this, LinkedList);
this.clear();
}
LinkedList.fromSlice = function fromSlice(slice) {
var list = new LinkedList();
slice.forEachNode(function (n) {
return list.append(n.clone());
});
return list;
};
LinkedList.prototype.head = function head() {
return this._head;
};
LinkedList.prototype.tail = function tail() {
return this._tail;
};
LinkedList.prototype.clear = function clear() {
this._head = this._tail = null;
};
LinkedList.prototype.isEmpty = function isEmpty() {
return this._head === null;
};
LinkedList.prototype.toArray = function toArray() {
var out = [];
this.forEachNode(function (n) {
return out.push(n);
});
return out;
};
LinkedList.prototype.splice = function splice(start, end, reference) {
var before = void 0;
if (reference === null) {
before = this._tail;
this._tail = end;
} else {
before = reference.prev;
end.next = reference;
reference.prev = end;
}
if (before) {
before.next = start;
start.prev = before;
}
};
LinkedList.prototype.nextNode = function nextNode(node) {
return node.next;
};
LinkedList.prototype.prevNode = function prevNode(node) {
return node.prev;
};
LinkedList.prototype.forEachNode = function forEachNode(callback) {
var node = this._head;
while (node !== null) {
callback(node);
node = node.next;
}
};
LinkedList.prototype.contains = function contains(needle) {
var node = this._head;
while (node !== null) {
if (node === needle) return true;
node = node.next;
}
return false;
};
LinkedList.prototype.insertBefore = function insertBefore(node) {
var reference = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
if (reference === null) return this.append(node);
if (reference.prev) reference.prev.next = node;else this._head = node;
node.prev = reference.prev;
node.next = reference;
reference.prev = node;
return node;
};
LinkedList.prototype.append = function append(node) {
var tail = this._tail;
if (tail) {
tail.next = node;
node.prev = tail;
node.next = null;
} else {
this._head = node;
}
return this._tail = node;
};
LinkedList.prototype.pop = function pop() {
if (this._tail) return this.remove(this._tail);
return null;
};
LinkedList.prototype.prepend = function prepend(node) {
if (this._head) return this.insertBefore(node, this._head);
return this._head = this._tail = node;
};
LinkedList.prototype.remove = function remove(node) {
if (node.prev) node.prev.next = node.next;else this._head = node.next;
if (node.next) node.next.prev = node.prev;else this._tail = node.prev;
return node;
};
return LinkedList;
}();
export var ListSlice = function () {
function ListSlice(head, tail) {
_classCallCheck(this, ListSlice);
this._head = head;
this._tail = tail;
}
ListSlice.toList = function toList(slice) {
var list = new LinkedList();
slice.forEachNode(function (n) {
return list.append(n.clone());
});
return list;
};
ListSlice.prototype.forEachNode = function forEachNode(callback) {
var node = this._head;
while (node !== null) {
callback(node);
node = this.nextNode(node);
}
};
ListSlice.prototype.contains = function contains(needle) {
var node = this._head;
while (node !== null) {
if (node === needle) return true;
node = node.next;
}
return false;
};
ListSlice.prototype.head = function head() {
return this._head;
};
ListSlice.prototype.tail = function tail() {
return this._tail;
};
ListSlice.prototype.toArray = function toArray() {
var out = [];
this.forEachNode(function (n) {
return out.push(n);
});
return out;
};
ListSlice.prototype.nextNode = function nextNode(node) {
if (node === this._tail) return null;
return node.next;
};
ListSlice.prototype.prevNode = function prevNode(node) {
if (node === this._head) return null;
return node.prev;
};
ListSlice.prototype.isEmpty = function isEmpty() {
return false;
};
return ListSlice;
}();
export var EMPTY_SLICE = new ListSlice(null, null);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9saXN0LXV0aWxzLmpzIl0sIm5hbWVzIjpbIkxpc3ROb2RlIiwidmFsdWUiLCJuZXh0IiwicHJldiIsIkxpbmtlZExpc3QiLCJjbGVhciIsImZyb21TbGljZSIsInNsaWNlIiwibGlzdCIsImZvckVhY2hOb2RlIiwiYXBwZW5kIiwibiIsImNsb25lIiwiaGVhZCIsIl9oZWFkIiwidGFpbCIsIl90YWlsIiwiaXNFbXB0eSIsInRvQXJyYXkiLCJvdXQiLCJwdXNoIiwic3BsaWNlIiwic3RhcnQiLCJlbmQiLCJyZWZlcmVuY2UiLCJiZWZvcmUiLCJuZXh0Tm9kZSIsIm5vZGUiLCJwcmV2Tm9kZSIsImNhbGxiYWNrIiwiY29udGFpbnMiLCJuZWVkbGUiLCJpbnNlcnRCZWZvcmUiLCJwb3AiLCJyZW1vdmUiLCJwcmVwZW5kIiwiTGlzdFNsaWNlIiwidG9MaXN0IiwiRU1QVFlfU0xJQ0UiXSwibWFwcGluZ3MiOiI7O0FBQUEsV0FBYUEsUUFBYixHQUNJLGtCQUFZQyxLQUFaLEVBQW1CO0FBQUE7O0FBQ2YsU0FBS0MsSUFBTCxHQUFZLElBQVo7QUFDQSxTQUFLQyxJQUFMLEdBQVksSUFBWjtBQUNBLFNBQUtGLEtBQUwsR0FBYUEsS0FBYjtBQUNILENBTEw7QUFPQSxXQUFhRyxVQUFiO0FBQ0ksMEJBQWM7QUFBQTs7QUFDVixhQUFLQyxLQUFMO0FBQ0g7O0FBSEwsZUFJV0MsU0FKWCxzQkFJcUJDLEtBSnJCLEVBSTRCO0FBQ3BCLFlBQUlDLE9BQU8sSUFBSUosVUFBSixFQUFYO0FBQ0FHLGNBQU1FLFdBQU4sQ0FBa0I7QUFBQSxtQkFBS0QsS0FBS0UsTUFBTCxDQUFZQyxFQUFFQyxLQUFGLEVBQVosQ0FBTDtBQUFBLFNBQWxCO0FBQ0EsZUFBT0osSUFBUDtBQUNILEtBUkw7O0FBQUEseUJBU0lLLElBVEosbUJBU1c7QUFDSCxlQUFPLEtBQUtDLEtBQVo7QUFDSCxLQVhMOztBQUFBLHlCQVlJQyxJQVpKLG1CQVlXO0FBQ0gsZUFBTyxLQUFLQyxLQUFaO0FBQ0gs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LElBQVo7QUFDSCxLQTNDTDs7QUFBQSx3QkE0Q0ljLE9BNUNKLHNCQTRDYztBQUNOLGVBQU8sS0FBUDtBQUNILEtBOUNMOztBQUFBO0FBQUE7QUFnREEsT0FBTyxJQUFNcUIsY0FBYyxJQUFJRixTQUFKLENBQWMsSUFBZCxFQUFvQixJQUFwQixDQUFwQiIsImZpbGUiOiJsaWIvbGlzdC11dGlscy5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBMaXN0Tm9kZSB7XG4gICAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5wcmV2ID0gbnVsbDtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBMaW5rZWRMaXN0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbVNsaWNlKHNsaWNlKSB7XG4gICAgICAgIGxldCBsaXN0ID0gbmV3IExpbmtlZExpc3QoKTtcbiAgICAgICAgc2xpY2UuZm9yRWFjaE5vZGUobiA9PiBsaXN0LmFwcGVuZChuLmNsb25lKCkpKTtcbiAgICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuICAgIGhlYWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWFkO1xuICAgIH1cbiAgICB0YWlsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFpbDtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX2hlYWQgPSB0aGlzLl90YWlsID0gbnVsbDtcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWQgPT09IG51bGw7XG4gICAgfVxuICAgIHRvQXJyYXkoKSB7XG4gICAgICAgIGxldCBvdXQgPSBbXTtcbiAgICAgICAgdGhpcy5mb3JFYWNoTm9kZShuID0+IG91dC5wdXNoKG4pKTtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgc3BsaWNlKHN0YXJ0LCBlbmQsIHJlZmVyZW5jZSkge1xuICAgICAgICBsZXQgYmVmb3JlO1xuICAgICAgICBpZiAocmVmZXJlbmNlID09PSBudWxsKSB7XG4gICAgICAgICAgICBiZWZvcmUgPSB0aGlzLl90YWlsO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGVuZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJlZm9yZSA9IHJlZmVyZW5jZS5wcmV2O1xuICAgICAgICAgICAgZW5kLm5leHQgPSByZWZlcmVuY2U7XG4gICAgICAgICAgICByZWZlcmVuY2UucHJldiA9IGVuZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmVmb3JlKSB7XG4gICAgICAgICAgICBiZWZvcmUubmV4dCA9IHN0YXJ0O1xuICAgICAgICAgICAgc3RhcnQucHJldiA9IGJlZm9yZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZXh0Tm9kZShub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLm5leHQ7XG4gICAgfVxuICAgIHByZXZOb2RlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUucHJldjtcbiAgICB9XG4gICAgZm9yRWFjaE5vZGUoY2FsbGJhY2spIHtcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLl9oZWFkO1xuICAgICAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY2FsbGJhY2sobm9kZSk7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5uZXh0O1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnRhaW5zKG5lZWRsZSkge1xuICAgICAgICBsZXQgbm9kZSA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAobm9kZSA9PT0gbmVlZGxlKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpbnNlcnRCZWZvcmUobm9kZSwgcmVmZXJlbmNlID0gbnVsbCkge1xuICAgICAgICBpZiAocmVmZXJlbmNlID09PSBudWxsKSByZXR1cm4gdGhpcy5hcHBlbmQobm9kZSk7XG4gICAgICAgIGlmIChyZWZlcmVuY2UucHJldikgcmVmZXJlbmNlLnByZXYubmV4dCA9IG5vZGU7ZWxzZSB0aGlzLl9oZWFkID0gbm9kZTtcbiAgICAgICAgbm9kZS5wcmV2ID0gcmVmZXJlbmNlLnByZXY7XG4gICAgICAgIG5vZGUubmV4dCA9IHJlZmVyZW5jZTtcbiAgICAgICAgcmVmZXJlbmNlLnByZXYgPSBub2RlO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgYXBwZW5kKG5vZGUpIHtcbiAgICAgICAgbGV0IHRhaWwgPSB0aGlzLl90YWlsO1xuICAgICAgICBpZiAodGFpbCkge1xuICAgICAgICAgICAgdGFpbC5uZXh0ID0gbm9kZTtcbiAgICAgICAgICAgIG5vZGUucHJldiA9IHRhaWw7XG4gICAgICAgICAgICBub2RlLm5leHQgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhaWwgPSBub2RlO1xuICAgIH1cbiAgICBwb3AoKSB7XG4gICAgICAgIGlmICh0aGlzLl90YWlsKSByZXR1cm4gdGhpcy5yZW1vdmUodGhpcy5fdGFpbCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBwcmVwZW5kKG5vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2hlYWQpIHJldHVybiB0aGlzLmluc2VydEJlZm9yZShub2RlLCB0aGlzLl9oZWFkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWQgPSB0aGlzLl90YWlsID0gbm9kZTtcbiAgICB9XG4gICAgcmVtb3ZlKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUucHJldikgbm9kZS5wcmV2Lm5leHQgPSBub2RlLm5leHQ7ZWxzZSB0aGlzLl9oZWFkID0gbm9kZS5uZXh0O1xuICAgICAgICBpZiAobm9kZS5uZXh0KSBub2RlLm5leHQucHJldiA9IG5vZGUucHJldjtlbHNlIHRoaXMuX3RhaWwgPSBub2RlLnByZXY7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBMaXN0U2xpY2Uge1xuICAgIGNvbnN0cnVjdG9yKGhlYWQsIHRhaWwpIHtcbiAgICAgICAgdGhpcy5faGVhZCA9IGhlYWQ7XG4gICAgICAgIHRoaXMuX3RhaWwgPSB0YWlsO1xuICAgIH1cbiAgICBzdGF0aWMgdG9MaXN0KHNsaWNlKSB7XG4gICAgICAgIGxldCBsaXN0ID0gbmV3IExpbmtlZExpc3QoKTtcbiAgICAgICAgc2xpY2UuZm9yRWFjaE5vZGUobiA9PiBsaXN0LmFwcGVuZChuLmNsb25lKCkpKTtcbiAgICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuICAgIGZvckVhY2hOb2RlKGNhbGxiYWNrKSB7XG4gICAgICAgIGxldCBub2RlID0gdGhpcy5faGVhZDtcbiAgICAgICAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG5vZGUpO1xuICAgICAgICAgICAgbm9kZSA9IHRoaXMubmV4dE5vZGUobm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29udGFpbnMobmVlZGxlKSB7XG4gICAgICAgIGxldCBub2RlID0gdGhpcy5faGVhZDtcbiAgICAgICAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChub2RlID09PSBuZWVkbGUpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGhlYWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWFkO1xuICAgIH1cbiAgICB0YWlsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFpbDtcbiAgICB9XG4gICAgdG9BcnJheSgpIHtcbiAgICAgICAgbGV0IG91dCA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2hOb2RlKG4gPT4gb3V0LnB1c2gobikpO1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICBuZXh0Tm9kZShub2RlKSB7XG4gICAgICAgIGlmIChub2RlID09PSB0aGlzLl90YWlsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIG5vZGUubmV4dDtcbiAgICB9XG4gICAgcHJldk5vZGUobm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PT0gdGhpcy5faGVhZCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBub2RlLnByZXY7XG4gICAgfVxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgRU1QVFlfU0xJQ0UgPSBuZXcgTGlzdFNsaWNlKG51bGwsIG51bGwpOyJdfQ==