collect-your-stuff 1.1.0 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +1492 -1488
  2. package/browser/collect-your-stuff.js +19292 -19268
  3. package/browser/collect-your-stuff.min.js +1 -1
  4. package/dist/collections/arrayable/ArrayElement.d.ts +37 -37
  5. package/dist/collections/arrayable/ArrayElement.js +71 -71
  6. package/dist/collections/arrayable/Arrayable.d.ts +109 -108
  7. package/dist/collections/arrayable/Arrayable.js +196 -195
  8. package/dist/collections/arrayable/Arrayable.min.js +1 -1
  9. package/dist/collections/doubly-linked-list/DoubleLinker.d.ts +47 -47
  10. package/dist/collections/doubly-linked-list/DoubleLinker.js +77 -77
  11. package/dist/collections/doubly-linked-list/DoublyLinkedList.d.ts +114 -113
  12. package/dist/collections/doubly-linked-list/DoublyLinkedList.js +275 -257
  13. package/dist/collections/doubly-linked-list/DoublyLinkedList.min.js +1 -1
  14. package/dist/collections/linked-list/LinkedList.d.ts +110 -109
  15. package/dist/collections/linked-list/LinkedList.js +241 -232
  16. package/dist/collections/linked-list/LinkedList.min.js +1 -1
  17. package/dist/collections/linked-list/Linker.d.ts +44 -44
  18. package/dist/collections/linked-list/Linker.js +87 -87
  19. package/dist/collections/linked-tree-list/LinkedTreeList.d.ts +136 -135
  20. package/dist/collections/linked-tree-list/LinkedTreeList.js +261 -256
  21. package/dist/collections/linked-tree-list/LinkedTreeList.min.js +1 -1
  22. package/dist/collections/linked-tree-list/TreeLinker.d.ts +62 -62
  23. package/dist/collections/linked-tree-list/TreeLinker.js +85 -85
  24. package/dist/collections/queue/Queue.d.ts +64 -60
  25. package/dist/collections/queue/Queue.js +137 -125
  26. package/dist/collections/queue/Queue.min.js +1 -1
  27. package/dist/collections/queue/Queueable.d.ts +78 -78
  28. package/dist/collections/queue/Queueable.js +148 -146
  29. package/dist/collections/queue/Queueable.min.js +1 -1
  30. package/dist/collections/stack/Stack.d.ts +64 -60
  31. package/dist/collections/stack/Stack.js +113 -103
  32. package/dist/collections/stack/Stack.min.js +1 -1
  33. package/dist/collections/stack/Stackable.d.ts +57 -57
  34. package/dist/collections/stack/Stackable.js +90 -90
  35. package/dist/main.d.ts +40 -40
  36. package/dist/main.js +51 -51
  37. package/dist/recipes/ArrayIterator.d.ts +11 -11
  38. package/dist/recipes/ArrayIterator.js +30 -30
  39. package/dist/recipes/DoubleLinkerIterator.d.ts +10 -10
  40. package/dist/recipes/DoubleLinkerIterator.js +24 -24
  41. package/dist/recipes/IsArrayable.d.ts +105 -105
  42. package/dist/recipes/IsArrayable.js +5 -5
  43. package/dist/recipes/IsDoubleLinker.d.ts +14 -14
  44. package/dist/recipes/IsDoubleLinker.js +5 -5
  45. package/dist/recipes/IsElement.d.ts +14 -14
  46. package/dist/recipes/IsElement.js +5 -5
  47. package/dist/recipes/IsLinker.d.ts +10 -10
  48. package/dist/recipes/IsLinker.js +5 -5
  49. package/dist/recipes/IsTree.d.ts +11 -11
  50. package/dist/recipes/IsTree.js +5 -5
  51. package/dist/recipes/IsTreeNode.d.ts +29 -29
  52. package/dist/recipes/IsTreeNode.js +5 -5
  53. package/dist/recipes/LinkerIterator.d.ts +10 -10
  54. package/dist/recipes/LinkerIterator.js +24 -24
  55. package/dist/recipes/Runnable.d.ts +54 -54
  56. package/dist/recipes/Runnable.js +69 -69
  57. package/dist/recipes/TreeLinkerIterator.d.ts +10 -10
  58. package/dist/recipes/TreeLinkerIterator.js +26 -26
  59. package/dist/recipes/recipes.d.ts +16 -16
  60. package/dist/recipes/recipes.js +24 -24
  61. package/dist/services/parseTree.d.ts +10 -10
  62. package/dist/services/parseTree.js +25 -25
  63. package/dist/services/parseTreeNext.d.ts +15 -15
  64. package/dist/services/parseTreeNext.js +47 -47
  65. package/dist/services/services.d.ts +14 -14
  66. package/dist/services/services.js +24 -24
  67. package/package.json +3 -2
@@ -1,257 +1,275 @@
1
- 'use strict'
2
-
3
- Object.defineProperty(exports, '__esModule', {
4
- value: true
5
- })
6
- exports.default = void 0
7
- var _DoubleLinker = _interopRequireDefault(require('./DoubleLinker'))
8
- var _DoubleLinkerIterator = _interopRequireDefault(require('../../recipes/DoubleLinkerIterator'))
9
- var _LinkedList = _interopRequireDefault(require('../linked-list/LinkedList'))
10
- function _interopRequireDefault (obj) { return obj && obj.__esModule ? obj : { default: obj } }
11
- /**
12
- * @file doubly linked list.
13
- * @author Joshua Heagle <joshuaheagle@gmail.com>
14
- * @version 1.1.0
15
- * @memberOf module:collect-your-stuff
16
- */
17
-
18
- /**
19
- * DoublyLinkedList represents a collection stored as a LinkedList with prev and next references.
20
- * @extends LinkedList
21
- */
22
- class DoublyLinkedList {
23
- /**
24
- * Create the new DoublyLinkedList instance.
25
- */
26
- constructor () {
27
- this.classType = DoublyLinkedList
28
- this.innerList = null
29
- this.initialized = false
30
- }
31
-
32
- /**
33
- * Initialize the inner list, should only run once.
34
- * @param {DoubleLinker} initialList Give the list of double-linkers to start in this doubly linked-list.
35
- * @return {DoublyLinkedList}
36
- */
37
- initialize (initialList) {
38
- return _LinkedList.default.prototype.initialize.call(this, initialList)
39
- }
40
-
41
- /**
42
- * Retrieve a copy of the innerList used.
43
- * @returns {DoubleLinker}
44
- */
45
- get list () {
46
- return this.innerList
47
- }
48
-
49
- /**
50
- * Retrieve the first DoubleLinker in the list.
51
- * @returns {DoubleLinker}
52
- */
53
- get first () {
54
- return this.reset()
55
- }
56
-
57
- /**
58
- * Retrieve the last DoubleLinker in the list.
59
- * @returns {DoubleLinker}
60
- */
61
- get last () {
62
- let tail = this.innerList
63
- let next = tail.next
64
- while (next !== null) {
65
- tail = next
66
- next = tail.next
67
- }
68
- return tail
69
- }
70
-
71
- /**
72
- * Return the length of the list.
73
- * @returns {number}
74
- */
75
- get length () {
76
- let current = this.first
77
- let length = 0
78
- while (current !== null) {
79
- ++length
80
- current = current.next
81
- }
82
- return length
83
- }
84
-
85
- /**
86
- * Insert a new node (or data) after a node.
87
- * @param {DoubleLinker|*} node The existing node as reference
88
- * @param {DoubleLinker|*} newNode The new node to go after the existing node
89
- * @returns {DoublyLinkedList}
90
- */
91
- insertAfter (node, newNode) {
92
- newNode = node.classType.make(newNode)
93
- // Ensure the next reference of this node is assigned to the new node
94
- newNode.next = node.next
95
- // Ensure this node is assigned as the prev reference of the new node
96
- newNode.prev = node
97
- // Then set this node's next reference to the new node
98
- node.next = newNode
99
- if (newNode.next) {
100
- // Update the next reference to ensure circular reference for prev points to the new node
101
- newNode.next.prev = newNode
102
- }
103
- this.reset()
104
- return this
105
- }
106
-
107
- /**
108
- * Insert a new node (or data) before a node.
109
- * @param {DoubleLinker|*} node The existing node as reference
110
- * @param {DoubleLinker|*} newNode The new node to go before the existing node
111
- * @returns {DoublyLinkedList}
112
- */
113
- insertBefore (node, newNode) {
114
- newNode = node.classType.make(newNode)
115
- // The new node will reference this prev node as prev
116
- newNode.prev = node.prev
117
- // The new node will reference this node as next
118
- newNode.next = node
119
- // This prev will reference the new node
120
- node.prev = newNode
121
- if (newNode.prev) {
122
- // Update the prev reference to ensure circular reference for next points to the new node
123
- newNode.prev.next = newNode
124
- }
125
- this.reset()
126
- return this
127
- }
128
-
129
- /**
130
- * Add a node (or data) after the given (or last) node in the list.
131
- * @param {DoubleLinker|*} node The new node to add to the end of the list
132
- * @param {DoubleLinker} after The existing last node
133
- * @returns {DoubleLinker}
134
- */
135
- append (node) {
136
- const after = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.last
137
- return this.insertAfter(after, node)
138
- }
139
-
140
- /**
141
- * Add a node (or data) before the given (or first) node in the list.
142
- * @param {DoubleLinker|*} node The new node to add to the start of the list
143
- * @param {DoubleLinker} before The existing first node
144
- * @returns {DoubleLinker}
145
- */
146
- prepend (node) {
147
- const before = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.first
148
- return this.insertBefore(before, node)
149
- }
150
-
151
- /**
152
- * Remove a linker from this linked list.
153
- * @param {DoubleLinker} node The node we wish to remove (and it will be returned after removal)
154
- * @return {DoubleLinker}
155
- */
156
- remove (node) {
157
- if (node.prev) {
158
- // The previous node will reference this next node
159
- node.prev.next = node.next
160
- }
161
- if (node.next) {
162
- // The next node will reference this previous node
163
- node.next.prev = node.prev
164
- }
165
- // Update head reference
166
- this.reset()
167
- return node
168
- }
169
-
170
- /**
171
- * Refresh all references and return head reference.
172
- * @return {DoubleLinker}
173
- */
174
- reset () {
175
- // Start at the pointer for the list
176
- let pointer = this.innerList
177
- if (pointer === null) {
178
- return null
179
- }
180
- let next = pointer.next
181
- // Follow references till the end
182
- while (next !== null) {
183
- pointer = next
184
- next = pointer.next
185
- }
186
- let prev = pointer.prev
187
- // From final reference, follow references back to the beginning
188
- while (prev !== null) {
189
- pointer = prev
190
- prev = pointer.prev
191
- }
192
- // All the live references should have been found, and we are pointing to the true head
193
- this.innerList = pointer
194
- return pointer
195
- }
196
-
197
- /**
198
- * Retrieve a DoubleLinker item from this list by numeric index, otherwise return null.
199
- * @param {number} index The integer number for retrieving a node by position.
200
- * @returns {DoubleLinker|null}
201
- */
202
- item (index) {
203
- if (index >= 0) {
204
- // For a positive index, start from the beginning of the list until the current item counter equals our index
205
- let current = this.first
206
- let currentIndex = -1
207
- while (++currentIndex < index && current !== null) {
208
- current = current.next
209
- }
210
- return currentIndex === index ? current : null
211
- }
212
- // For a negative index, get the delta of index and length, then go backwards until we reach that delta
213
- let current = this.last
214
- let currentIndex = this.length
215
- const calculatedIndex = this.length + index
216
- if (calculatedIndex < 0) {
217
- return null
218
- }
219
- while (--currentIndex > calculatedIndex && current !== null) {
220
- current = current.prev
221
- }
222
- return currentIndex === calculatedIndex ? current : null
223
- }
224
-
225
- /**
226
- * Be able to run forEach on this DoublyLinkedList to iterate over the DoubleLinker Items.
227
- * @param {forEachCallback} callback The function to call for-each double linker
228
- * @param {DoublyLinkedList} thisArg Optional, 'this' reference
229
- */
230
- forEach (callback) {
231
- const thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this
232
- return _LinkedList.default.prototype.forEach.call(this, callback, thisArg)
233
- }
234
-
235
- /**
236
- * Be able to iterate over this class.
237
- * @returns {Iterator}
238
- */
239
- [Symbol.iterator] () {
240
- const current = this.first
241
- return new _DoubleLinkerIterator.default(current)
242
- }
243
- }
244
- /**
245
- * Convert an array into a DoublyLinkedList instance, return the new instance.
246
- * @param {Array} [values=[]] An array of values which will be converted to linkers in this doubly-linked-list
247
- * @param {IsDoubleLinker} [linkerClass=DoubleLinker] The class to use for each linker
248
- * @param {IsArrayable<IsDoubleLinker>} [classType=LinkedList] Provide the type of IsArrayable to use.
249
- * @returns {DoublyLinkedList}
250
- */
251
- DoublyLinkedList.fromArray = function () {
252
- const values = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []
253
- const linkerClass = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _DoubleLinker.default
254
- const classType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : DoublyLinkedList
255
- return _LinkedList.default.fromArray(values, linkerClass, classType)
256
- }
257
- var _default = exports.default = DoublyLinkedList
1
+ 'use strict'
2
+
3
+ Object.defineProperty(exports, '__esModule', {
4
+ value: true
5
+ })
6
+ exports.default = void 0
7
+ var _DoubleLinker = _interopRequireDefault(require('./DoubleLinker'))
8
+ var _DoubleLinkerIterator = _interopRequireDefault(require('../../recipes/DoubleLinkerIterator'))
9
+ var _LinkedList = _interopRequireDefault(require('../linked-list/LinkedList'))
10
+ function _interopRequireDefault (obj) { return obj && obj.__esModule ? obj : { default: obj } }
11
+ /**
12
+ * @file doubly linked list.
13
+ * @author Joshua Heagle <joshuaheagle@gmail.com>
14
+ * @version 1.1.0
15
+ * @memberOf module:collect-your-stuff
16
+ */
17
+
18
+ /**
19
+ * DoublyLinkedList represents a collection stored as a LinkedList with prev and next references.
20
+ * @extends LinkedList
21
+ */
22
+ class DoublyLinkedList {
23
+ /**
24
+ * Create the new DoublyLinkedList instance.
25
+ */
26
+ constructor () {
27
+ const linkerClass = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _DoubleLinker.default
28
+ this.classType = DoublyLinkedList
29
+ this.innerList = null
30
+ this.initialized = false
31
+ this.linkerClass = linkerClass
32
+ }
33
+
34
+ /**
35
+ * Initialize the inner list, should only run once.
36
+ * @param {DoubleLinker} initialList Give the list of double-linkers to start in this doubly linked-list.
37
+ * @return {DoublyLinkedList}
38
+ */
39
+ initialize (initialList) {
40
+ return _LinkedList.default.prototype.initialize.call(this, initialList)
41
+ }
42
+
43
+ /**
44
+ * Retrieve a copy of the innerList used.
45
+ * @returns {DoubleLinker}
46
+ */
47
+ get list () {
48
+ return this.innerList
49
+ }
50
+
51
+ /**
52
+ * Retrieve the first DoubleLinker in the list.
53
+ * @returns {DoubleLinker}
54
+ */
55
+ get first () {
56
+ return this.reset()
57
+ }
58
+
59
+ /**
60
+ * Retrieve the last DoubleLinker in the list.
61
+ * @returns {DoubleLinker}
62
+ */
63
+ get last () {
64
+ let tail = this.innerList
65
+ if (tail === null) {
66
+ return null
67
+ }
68
+ let next = tail.next
69
+ while (next !== null) {
70
+ tail = next
71
+ next = tail.next
72
+ }
73
+ return tail
74
+ }
75
+
76
+ /**
77
+ * Return the length of the list.
78
+ * @returns {number}
79
+ */
80
+ get length () {
81
+ let current = this.first
82
+ let length = 0
83
+ while (current !== null) {
84
+ ++length
85
+ current = current.next
86
+ }
87
+ return length
88
+ }
89
+
90
+ /**
91
+ * Insert a new node (or data) after a node.
92
+ * @param {DoubleLinker|*} node The existing node as reference
93
+ * @param {DoubleLinker|*} newNode The new node to go after the existing node
94
+ * @returns {DoublyLinkedList}
95
+ */
96
+ insertAfter (node, newNode) {
97
+ newNode = this.linkerClass.make(newNode)
98
+ if (node !== null) {
99
+ // Ensure the next reference of this node is assigned to the new node
100
+ newNode.next = node.next
101
+ // Ensure this node is assigned as the prev reference of the new node
102
+ newNode.prev = node
103
+ // Then set this node's next reference to the new node
104
+ node.next = newNode
105
+ }
106
+ if (newNode.next) {
107
+ // Update the next reference to ensure circular reference for prev points to the new node
108
+ newNode.next.prev = newNode
109
+ }
110
+ if (!this.length) {
111
+ this.innerList = newNode
112
+ }
113
+ this.reset()
114
+ return this
115
+ }
116
+
117
+ /**
118
+ * Insert a new node (or data) before a node.
119
+ * @param {DoubleLinker|*} node The existing node as reference
120
+ * @param {DoubleLinker|*} newNode The new node to go before the existing node
121
+ * @returns {DoublyLinkedList}
122
+ */
123
+ insertBefore (node, newNode) {
124
+ newNode = this.linkerClass.make(newNode)
125
+ if (node !== null) {
126
+ // The new node will reference this prev node as prev
127
+ newNode.prev = node.prev
128
+ // The new node will reference this node as next
129
+ newNode.next = node
130
+ // This prev will reference the new node
131
+ node.prev = newNode
132
+ }
133
+ if (newNode.prev) {
134
+ // Update the prev reference to ensure circular reference for next points to the new node
135
+ newNode.prev.next = newNode
136
+ }
137
+ if (!this.length) {
138
+ this.innerList = newNode
139
+ }
140
+ this.reset()
141
+ return this
142
+ }
143
+
144
+ /**
145
+ * Add a node (or data) after the given (or last) node in the list.
146
+ * @param {DoubleLinker|*} node The new node to add to the end of the list
147
+ * @param {DoubleLinker} after The existing last node
148
+ * @returns {DoubleLinker}
149
+ */
150
+ append (node) {
151
+ const after = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.last
152
+ return this.insertAfter(after, node)
153
+ }
154
+
155
+ /**
156
+ * Add a node (or data) before the given (or first) node in the list.
157
+ * @param {DoubleLinker|*} node The new node to add to the start of the list
158
+ * @param {DoubleLinker} before The existing first node
159
+ * @returns {DoubleLinker}
160
+ */
161
+ prepend (node) {
162
+ const before = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.first
163
+ return this.insertBefore(before, node)
164
+ }
165
+
166
+ /**
167
+ * Remove a linker from this linked list.
168
+ * @param {DoubleLinker} node The node we wish to remove (and it will be returned after removal)
169
+ * @return {DoubleLinker}
170
+ */
171
+ remove (node) {
172
+ if (node === null) {
173
+ return null
174
+ }
175
+ if (node.prev) {
176
+ // The previous node will reference this next node
177
+ node.prev.next = node.next
178
+ }
179
+ if (node.next) {
180
+ // The next node will reference this previous node
181
+ node.next.prev = node.prev
182
+ }
183
+ // Update head reference
184
+ this.reset()
185
+ return node
186
+ }
187
+
188
+ /**
189
+ * Refresh all references and return head reference.
190
+ * @return {DoubleLinker}
191
+ */
192
+ reset () {
193
+ // Start at the pointer for the list
194
+ let pointer = this.innerList
195
+ if (pointer === null) {
196
+ return null
197
+ }
198
+ let next = pointer.next
199
+ // Follow references till the end
200
+ while (next !== null) {
201
+ pointer = next
202
+ next = pointer.next
203
+ }
204
+ let prev = pointer.prev
205
+ // From final reference, follow references back to the beginning
206
+ while (prev !== null) {
207
+ pointer = prev
208
+ prev = pointer.prev
209
+ }
210
+ // All the live references should have been found, and we are pointing to the true head
211
+ this.innerList = pointer
212
+ return pointer
213
+ }
214
+
215
+ /**
216
+ * Retrieve a DoubleLinker item from this list by numeric index, otherwise return null.
217
+ * @param {number} index The integer number for retrieving a node by position.
218
+ * @returns {DoubleLinker|null}
219
+ */
220
+ item (index) {
221
+ if (index >= 0) {
222
+ // For a positive index, start from the beginning of the list until the current item counter equals our index
223
+ let current = this.first
224
+ let currentIndex = -1
225
+ while (++currentIndex < index && current !== null) {
226
+ current = current.next
227
+ }
228
+ return currentIndex === index ? current : null
229
+ }
230
+ // For a negative index, get the delta of index and length, then go backwards until we reach that delta
231
+ let current = this.last
232
+ let currentIndex = this.length
233
+ const calculatedIndex = this.length + index
234
+ if (calculatedIndex < 0) {
235
+ return null
236
+ }
237
+ while (--currentIndex > calculatedIndex && current !== null) {
238
+ current = current.prev
239
+ }
240
+ return currentIndex === calculatedIndex ? current : null
241
+ }
242
+
243
+ /**
244
+ * Be able to run forEach on this DoublyLinkedList to iterate over the DoubleLinker Items.
245
+ * @param {forEachCallback} callback The function to call for-each double linker
246
+ * @param {DoublyLinkedList} thisArg Optional, 'this' reference
247
+ */
248
+ forEach (callback) {
249
+ const thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this
250
+ return _LinkedList.default.prototype.forEach.call(this, callback, thisArg)
251
+ }
252
+
253
+ /**
254
+ * Be able to iterate over this class.
255
+ * @returns {Iterator}
256
+ */
257
+ [Symbol.iterator] () {
258
+ const current = this.first
259
+ return new _DoubleLinkerIterator.default(current)
260
+ }
261
+ }
262
+ /**
263
+ * Convert an array into a DoublyLinkedList instance, return the new instance.
264
+ * @param {Array} [values=[]] An array of values which will be converted to linkers in this doubly-linked-list
265
+ * @param {IsDoubleLinker} [linkerClass=DoubleLinker] The class to use for each linker
266
+ * @param {IsArrayable<IsDoubleLinker>} [classType=LinkedList] Provide the type of IsArrayable to use.
267
+ * @returns {DoublyLinkedList}
268
+ */
269
+ DoublyLinkedList.fromArray = function () {
270
+ const values = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []
271
+ const linkerClass = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _DoubleLinker.default
272
+ const classType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : DoublyLinkedList
273
+ return _LinkedList.default.fromArray(values, linkerClass, classType)
274
+ }
275
+ var _default = exports.default = DoublyLinkedList
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _DoubleLinker=_interopRequireDefault(require("./DoubleLinker")),_DoubleLinkerIterator=_interopRequireDefault(require("../../recipes/DoubleLinkerIterator")),_LinkedList=_interopRequireDefault(require("../linked-list/LinkedList"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}class DoublyLinkedList{constructor(){this.classType=DoublyLinkedList,this.innerList=null,this.initialized=!1}initialize(e){return _LinkedList.default.prototype.initialize.call(this,e)}get list(){return this.innerList}get first(){return this.reset()}get last(){let e=this.innerList,t=e.next;for(;null!==t;)e=t,t=e.next;return e}get length(){let e=this.first,t=0;for(;null!==e;)++t,e=e.next;return t}insertAfter(e,t){return(t=e.classType.make(t)).next=e.next,t.prev=e,e.next=t,t.next&&(t.next.prev=t),this.reset(),this}insertBefore(e,t){return(t=e.classType.make(t)).prev=e.prev,t.next=e,e.prev=t,t.prev&&(t.prev.next=t),this.reset(),this}append(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.last;return this.insertAfter(t,e)}prepend(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.first;return this.insertBefore(t,e)}remove(e){return e.prev&&(e.prev.next=e.next),e.next&&(e.next.prev=e.prev),this.reset(),e}reset(){let e=this.innerList;if(null===e)return null;let t=e.next;for(;null!==t;)e=t,t=e.next;let r=e.prev;for(;null!==r;)e=r,r=e.prev;return this.innerList=e,e}item(e){if(e>=0){let t=this.first,r=-1;for(;++r<e&&null!==t;)t=t.next;return r===e?t:null}let t=this.last,r=this.length;const i=this.length+e;if(i<0)return null;for(;--r>i&&null!==t;)t=t.prev;return r===i?t:null}forEach(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this;return _LinkedList.default.prototype.forEach.call(this,e,t)}[Symbol.iterator](){let e=this.first;return new _DoubleLinkerIterator.default(e)}}DoublyLinkedList.fromArray=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:_DoubleLinker.default,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:DoublyLinkedList;return _LinkedList.default.fromArray(e,t,r)};var _default=exports.default=DoublyLinkedList;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _DoubleLinker=_interopRequireDefault(require("./DoubleLinker")),_DoubleLinkerIterator=_interopRequireDefault(require("../../recipes/DoubleLinkerIterator")),_LinkedList=_interopRequireDefault(require("../linked-list/LinkedList"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}class DoublyLinkedList{constructor(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:_DoubleLinker.default;this.classType=DoublyLinkedList,this.innerList=null,this.initialized=!1,this.linkerClass=e}initialize(e){return _LinkedList.default.prototype.initialize.call(this,e)}get list(){return this.innerList}get first(){return this.reset()}get last(){let e=this.innerList;if(null===e)return null;let t=e.next;for(;null!==t;)e=t,t=e.next;return e}get length(){let e=this.first,t=0;for(;null!==e;)++t,e=e.next;return t}insertAfter(e,t){return t=this.linkerClass.make(t),null!==e&&(t.next=e.next,t.prev=e,e.next=t),t.next&&(t.next.prev=t),this.length||(this.innerList=t),this.reset(),this}insertBefore(e,t){return t=this.linkerClass.make(t),null!==e&&(t.prev=e.prev,t.next=e,e.prev=t),t.prev&&(t.prev.next=t),this.length||(this.innerList=t),this.reset(),this}append(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.last;return this.insertAfter(t,e)}prepend(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.first;return this.insertBefore(t,e)}remove(e){return null===e?null:(e.prev&&(e.prev.next=e.next),e.next&&(e.next.prev=e.prev),this.reset(),e)}reset(){let e=this.innerList;if(null===e)return null;let t=e.next;for(;null!==t;)e=t,t=e.next;let r=e.prev;for(;null!==r;)e=r,r=e.prev;return this.innerList=e,e}item(e){if(e>=0){let t=this.first,r=-1;for(;++r<e&&null!==t;)t=t.next;return r===e?t:null}let t=this.last,r=this.length;const i=this.length+e;if(i<0)return null;for(;--r>i&&null!==t;)t=t.prev;return r===i?t:null}forEach(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this;return _LinkedList.default.prototype.forEach.call(this,e,t)}[Symbol.iterator](){let e=this.first;return new _DoubleLinkerIterator.default(e)}}DoublyLinkedList.fromArray=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:_DoubleLinker.default,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:DoublyLinkedList;return _LinkedList.default.fromArray(e,t,r)};var _default=exports.default=DoublyLinkedList;