1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | var HeadNode = (function () {
|
4 | function HeadNode() {
|
5 |
|
6 | this.next = new TailNode(this);
|
7 | }
|
8 | return HeadNode;
|
9 | }());
|
10 | exports.HeadNode = HeadNode;
|
11 | var TailNode = (function () {
|
12 | function TailNode(head) {
|
13 | this.previous = head;
|
14 | }
|
15 | return TailNode;
|
16 | }());
|
17 | exports.TailNode = TailNode;
|
18 | var LinkedListNode = (function () {
|
19 | function LinkedListNode(item) {
|
20 | this.next = null;
|
21 | this.previous = null;
|
22 | this.item = item;
|
23 | }
|
24 | LinkedListNode.prototype.detachSelf = function () {
|
25 | if (!this.next && !this.previous) {
|
26 | throw new Error('node is not attached');
|
27 | }
|
28 | if (this.next) {
|
29 | this.next.previous = this.previous;
|
30 | }
|
31 | if (this.previous) {
|
32 | this.previous.next = this.next;
|
33 | }
|
34 | this.next = null;
|
35 | this.previous = null;
|
36 | };
|
37 | LinkedListNode.prototype.attachAfter = function (node) {
|
38 | if (this.next || this.previous) {
|
39 | throw new Error('Node is inserted elsewhere');
|
40 | }
|
41 | this.next = node.next;
|
42 | this.previous = node;
|
43 | if (node.next) {
|
44 | node.next.previous = this;
|
45 | }
|
46 | node.next = this;
|
47 | };
|
48 | LinkedListNode.prototype.attachBefore = function (node) {
|
49 | if (!node.previous) {
|
50 | throw new Error('no previous node found.');
|
51 | }
|
52 | this.attachAfter(node.previous);
|
53 | };
|
54 | return LinkedListNode;
|
55 | }());
|
56 | exports.LinkedListNode = LinkedListNode;
|
57 | var LinkedList = (function () {
|
58 | function LinkedList() {
|
59 | this.head = new HeadNode();
|
60 | this.tail = this.head.next;
|
61 | }
|
62 | LinkedList.prototype.add = function (item) {
|
63 | var newNode = new LinkedListNode(item);
|
64 | newNode.attachAfter(this.tail.previous);
|
65 | return newNode;
|
66 | };
|
67 | LinkedList.prototype.getItems = function () {
|
68 | var result = [];
|
69 | this.forEach(function (item) {
|
70 | result.push(item);
|
71 | });
|
72 | return result;
|
73 | };
|
74 | LinkedList.prototype.forEach = function (callback) {
|
75 | var current = this.head.next;
|
76 | while (current !== this.tail) {
|
77 |
|
78 | var item = current;
|
79 | callback(item.item, item);
|
80 | if (!item.next) {
|
81 | throw new Error('badly attached item found.');
|
82 | }
|
83 | current = item.next;
|
84 | }
|
85 | };
|
86 | LinkedList.prototype.hasItems = function () {
|
87 | return this.head.next !== this.tail;
|
88 | };
|
89 | LinkedList.prototype.getLastItem = function () {
|
90 | if (!this.hasItems()) {
|
91 | throw new Error('no items in list.');
|
92 | }
|
93 | return this.head.next;
|
94 | };
|
95 | return LinkedList;
|
96 | }());
|
97 | exports.LinkedList = LinkedList;
|
98 |
|
\ | No newline at end of file |