UNPKG

ember-legacy-class-transform

Version:
151 lines 3.68 kB
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);