ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
151 lines • 3.68 kB
JavaScript
export class ListNode {
constructor(value) {
this.next = null;
this.prev = null;
this.value = value;
}
}
export class LinkedList {
constructor() {
this.clear();
}
static fromSlice(slice) {
let list = new LinkedList();
slice.forEachNode(n => list.append(n.clone()));
return list;
}
head() {
return this._head;
}
tail() {
return this._tail;
}
clear() {
this._head = this._tail = null;
}
isEmpty() {
return this._head === null;
}
toArray() {
let out = [];
this.forEachNode(n => out.push(n));
return out;
}
splice(start, end, reference) {
let before;
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;
}
}
nextNode(node) {
return node.next;
}
prevNode(node) {
return node.prev;
}
forEachNode(callback) {
let node = this._head;
while (node !== null) {
callback(node);
node = node.next;
}
}
contains(needle) {
let node = this._head;
while (node !== null) {
if (node === needle) return true;
node = node.next;
}
return false;
}
insertBefore(node, reference = 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;
}
append(node) {
let tail = this._tail;
if (tail) {
tail.next = node;
node.prev = tail;
node.next = null;
} else {
this._head = node;
}
return this._tail = node;
}
pop() {
if (this._tail) return this.remove(this._tail);
return null;
}
prepend(node) {
if (this._head) return this.insertBefore(node, this._head);
return this._head = this._tail = node;
}
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;
}
}
export class ListSlice {
constructor(head, tail) {
this._head = head;
this._tail = tail;
}
static toList(slice) {
let list = new LinkedList();
slice.forEachNode(n => list.append(n.clone()));
return list;
}
forEachNode(callback) {
let node = this._head;
while (node !== null) {
callback(node);
node = this.nextNode(node);
}
}
contains(needle) {
let node = this._head;
while (node !== null) {
if (node === needle) return true;
node = node.next;
}
return false;
}
head() {
return this._head;
}
tail() {
return this._tail;
}
toArray() {
let out = [];
this.forEachNode(n => out.push(n));
return out;
}
nextNode(node) {
if (node === this._tail) return null;
return node.next;
}
prevNode(node) {
if (node === this._head) return null;
return node.prev;
}
isEmpty() {
return false;
}
}
export const EMPTY_SLICE = new ListSlice(null, null);