@speclynx/apidom-datamodel 1.12.2 → 2.0.1

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 (56) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +2 -2
  4. package/README.md +151 -19
  5. package/dist/apidom-datamodel.browser.js +1141 -167
  6. package/dist/apidom-datamodel.browser.min.js +1 -1
  7. package/package.json +6 -3
  8. package/src/KeyValuePair.cjs +0 -7
  9. package/src/KeyValuePair.mjs +0 -7
  10. package/src/Namespace.cjs +1 -1
  11. package/src/Namespace.mjs +1 -1
  12. package/src/ObjectSlice.cjs +0 -7
  13. package/src/ObjectSlice.mjs +0 -7
  14. package/src/clone/errors/CloneError.cjs +22 -0
  15. package/src/clone/errors/CloneError.mjs +19 -0
  16. package/src/clone/errors/DeepCloneError.cjs +11 -0
  17. package/src/clone/errors/DeepCloneError.mjs +6 -0
  18. package/src/clone/errors/ShallowCloneError.cjs +11 -0
  19. package/src/clone/errors/ShallowCloneError.mjs +6 -0
  20. package/src/clone/index.cjs +184 -0
  21. package/src/clone/index.mjs +174 -0
  22. package/src/elements/Annotation.cjs +35 -0
  23. package/src/elements/Annotation.mjs +30 -0
  24. package/src/elements/Comment.cjs +18 -0
  25. package/src/elements/Comment.mjs +13 -0
  26. package/src/elements/LinkElement.cjs +8 -2
  27. package/src/elements/LinkElement.mjs +8 -2
  28. package/src/elements/ParseResult.cjs +91 -0
  29. package/src/elements/ParseResult.mjs +86 -0
  30. package/src/elements/RefElement.cjs +4 -1
  31. package/src/elements/RefElement.mjs +4 -1
  32. package/src/elements/SourceMap.cjs +140 -0
  33. package/src/elements/SourceMap.mjs +134 -0
  34. package/src/index.cjs +31 -2
  35. package/src/index.mjs +7 -3
  36. package/src/predicates/elements.cjs +46 -0
  37. package/src/predicates/elements.mjs +35 -0
  38. package/src/predicates/index.cjs +68 -0
  39. package/src/predicates/index.mjs +48 -0
  40. package/src/predicates/primitives.cjs +69 -0
  41. package/src/predicates/primitives.mjs +56 -0
  42. package/src/primitives/ArrayElement.cjs +0 -21
  43. package/src/primitives/ArrayElement.mjs +0 -21
  44. package/src/primitives/CollectionElement.cjs +5 -19
  45. package/src/primitives/CollectionElement.mjs +5 -19
  46. package/src/primitives/Element.cjs +110 -60
  47. package/src/primitives/Element.mjs +110 -60
  48. package/src/primitives/MemberElement.cjs +6 -2
  49. package/src/primitives/MemberElement.mjs +6 -2
  50. package/src/primitives/ObjectElement.cjs +0 -2
  51. package/src/primitives/ObjectElement.mjs +0 -2
  52. package/src/registration.cjs +8 -0
  53. package/src/registration.mjs +5 -1
  54. package/src/serialisers/JSONSerialiser.cjs +35 -4
  55. package/src/serialisers/JSONSerialiser.mjs +34 -8
  56. package/types/apidom-datamodel.d.ts +347 -51
package/src/index.mjs CHANGED
@@ -1,6 +1,10 @@
1
1
  export { default as Namespace } from "./Namespace.mjs";
2
- export { default as KeyValuePair } from "./KeyValuePair.mjs"; // Re-export elements directly to preserve JSDoc
3
- export { ObjectSlice, Element, CollectionElement, StringElement, NumberElement, BooleanElement, NullElement, ArrayElement, ObjectElement, MemberElement, RefElement, LinkElement, refract } from "./registration.mjs";
2
+ export { default as KeyValuePair } from "./KeyValuePair.mjs"; // Clone utilities
3
+ export { cloneShallow, cloneDeep, CloneError, DeepCloneError, ShallowCloneError } from "./clone/index.mjs";
4
+ // Re-export elements directly to preserve JSDoc
5
+ export { ObjectSlice, Element, CollectionElement, StringElement, NumberElement, BooleanElement, NullElement, ArrayElement, ObjectElement, MemberElement, RefElement, LinkElement, AnnotationElement, CommentElement, ParseResultElement, SourceMapElement, refract } from "./registration.mjs";
4
6
  export { default as JSONSerialiser } from "./serialisers/JSONSerialiser.mjs"; // Re-export types - essential public API
5
7
  // Re-export types - for advanced users extending the library
6
- // Re-export types - used in public method signatures
8
+ // Re-export types - used in public method signatures
9
+ // Re-export predicates
10
+ export { isElement, isStringElement, isNumberElement, isNullElement, isBooleanElement, isObjectElement, isArrayElement, isMemberElement, isLinkElement, isRefElement, isAnnotationElement, isCommentElement, isParseResultElement, isSourceMapElement, isPrimitiveElement, hasElementSourceMap, includesSymbols, includesClasses } from "./predicates/index.mjs";
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
4
+ exports.__esModule = true;
5
+ exports.isSourceMapElement = exports.isRefElement = exports.isParseResultElement = exports.isLinkElement = exports.isCommentElement = exports.isAnnotationElement = void 0;
6
+ var _LinkElement = _interopRequireDefault(require("../elements/LinkElement.cjs"));
7
+ var _RefElement = _interopRequireDefault(require("../elements/RefElement.cjs"));
8
+ var _Annotation = _interopRequireDefault(require("../elements/Annotation.cjs"));
9
+ var _Comment = _interopRequireDefault(require("../elements/Comment.cjs"));
10
+ var _ParseResult = _interopRequireDefault(require("../elements/ParseResult.cjs"));
11
+ var _SourceMap = _interopRequireDefault(require("../elements/SourceMap.cjs"));
12
+ /**
13
+ * @public
14
+ */
15
+ const isLinkElement = element => element instanceof _LinkElement.default;
16
+
17
+ /**
18
+ * @public
19
+ */
20
+ exports.isLinkElement = isLinkElement;
21
+ const isRefElement = element => element instanceof _RefElement.default;
22
+
23
+ /**
24
+ * @public
25
+ */
26
+ exports.isRefElement = isRefElement;
27
+ const isAnnotationElement = element => element instanceof _Annotation.default;
28
+
29
+ /**
30
+ * @public
31
+ */
32
+ exports.isAnnotationElement = isAnnotationElement;
33
+ const isCommentElement = element => element instanceof _Comment.default;
34
+
35
+ /**
36
+ * @public
37
+ */
38
+ exports.isCommentElement = isCommentElement;
39
+ const isParseResultElement = element => element instanceof _ParseResult.default;
40
+
41
+ /**
42
+ * @public
43
+ */
44
+ exports.isParseResultElement = isParseResultElement;
45
+ const isSourceMapElement = element => element instanceof _SourceMap.default;
46
+ exports.isSourceMapElement = isSourceMapElement;
@@ -0,0 +1,35 @@
1
+ import LinkElement from "../elements/LinkElement.mjs";
2
+ import RefElement from "../elements/RefElement.mjs";
3
+ import AnnotationElement from "../elements/Annotation.mjs";
4
+ import CommentElement from "../elements/Comment.mjs";
5
+ import ParseResultElement from "../elements/ParseResult.mjs";
6
+ import SourceMapElement from "../elements/SourceMap.mjs";
7
+ /**
8
+ * @public
9
+ */
10
+ export const isLinkElement = element => element instanceof LinkElement;
11
+
12
+ /**
13
+ * @public
14
+ */
15
+ export const isRefElement = element => element instanceof RefElement;
16
+
17
+ /**
18
+ * @public
19
+ */
20
+ export const isAnnotationElement = element => element instanceof AnnotationElement;
21
+
22
+ /**
23
+ * @public
24
+ */
25
+ export const isCommentElement = element => element instanceof CommentElement;
26
+
27
+ /**
28
+ * @public
29
+ */
30
+ export const isParseResultElement = element => element instanceof ParseResultElement;
31
+
32
+ /**
33
+ * @public
34
+ */
35
+ export const isSourceMapElement = element => element instanceof SourceMapElement;
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.isStringElement = exports.isSourceMapElement = exports.isRefElement = exports.isPrimitiveElement = exports.isParseResultElement = exports.isObjectElement = exports.isNumberElement = exports.isNullElement = exports.isMemberElement = exports.isLinkElement = exports.isCommentElement = exports.isBooleanElement = exports.isAnnotationElement = exports.includesSymbols = exports.includesClasses = exports.hasElementSourceMap = void 0;
5
+ var _primitives = require("./primitives.cjs");
6
+ exports.isArrayElement = _primitives.isArrayElement;
7
+ exports.isElement = _primitives.isElement;
8
+ exports.isStringElement = _primitives.isStringElement;
9
+ exports.isNumberElement = _primitives.isNumberElement;
10
+ exports.isNullElement = _primitives.isNullElement;
11
+ exports.isBooleanElement = _primitives.isBooleanElement;
12
+ exports.isObjectElement = _primitives.isObjectElement;
13
+ exports.isMemberElement = _primitives.isMemberElement;
14
+ exports.isPrimitiveElement = _primitives.isPrimitiveElement;
15
+ var _elements = require("./elements.cjs");
16
+ exports.isLinkElement = _elements.isLinkElement;
17
+ exports.isRefElement = _elements.isRefElement;
18
+ exports.isAnnotationElement = _elements.isAnnotationElement;
19
+ exports.isCommentElement = _elements.isCommentElement;
20
+ exports.isParseResultElement = _elements.isParseResultElement;
21
+ exports.isSourceMapElement = _elements.isSourceMapElement;
22
+ /**
23
+ * Checks if an element has complete source position information.
24
+ * Returns true only if all 6 position properties are numbers.
25
+ * @public
26
+ */
27
+ const hasElementSourceMap = element => {
28
+ return typeof element.startLine === 'number' && typeof element.startCharacter === 'number' && typeof element.startOffset === 'number' && typeof element.endLine === 'number' && typeof element.endCharacter === 'number' && typeof element.endOffset === 'number';
29
+ };
30
+
31
+ /**
32
+ * @public
33
+ */
34
+ exports.hasElementSourceMap = hasElementSourceMap;
35
+ const includesSymbols = (element, symbols) => {
36
+ if (symbols.length === 0) {
37
+ return true;
38
+ }
39
+ if (!element.hasAttributesProperty('symbols')) {
40
+ return false;
41
+ }
42
+ const elementSymbols = element.attributes.get('symbols');
43
+ if (!(0, _primitives.isArrayElement)(elementSymbols)) {
44
+ return false;
45
+ }
46
+ return symbols.every(symbol => elementSymbols.includes(symbol));
47
+ };
48
+
49
+ /**
50
+ * @public
51
+ */
52
+ exports.includesSymbols = includesSymbols;
53
+ const includesClasses = (element, classes) => {
54
+ if (classes.length === 0) {
55
+ return true;
56
+ }
57
+ if (!(0, _primitives.isElement)(element)) {
58
+ return false;
59
+ }
60
+ if (element.isMetaEmpty) {
61
+ return false;
62
+ }
63
+ if (!element.hasMetaProperty('classes')) {
64
+ return false;
65
+ }
66
+ return classes.every(cls => element.classes.includes(cls));
67
+ };
68
+ exports.includesClasses = includesClasses;
@@ -0,0 +1,48 @@
1
+ import { isArrayElement, isElement } from "./primitives.mjs";
2
+ export { isStringElement, isNumberElement, isNullElement, isBooleanElement, isArrayElement, isObjectElement, isMemberElement, isPrimitiveElement } from "./primitives.mjs";
3
+ export { isElement };
4
+ export { isLinkElement, isRefElement, isAnnotationElement, isCommentElement, isParseResultElement, isSourceMapElement } from "./elements.mjs";
5
+ /**
6
+ * Checks if an element has complete source position information.
7
+ * Returns true only if all 6 position properties are numbers.
8
+ * @public
9
+ */
10
+ export const hasElementSourceMap = element => {
11
+ return typeof element.startLine === 'number' && typeof element.startCharacter === 'number' && typeof element.startOffset === 'number' && typeof element.endLine === 'number' && typeof element.endCharacter === 'number' && typeof element.endOffset === 'number';
12
+ };
13
+
14
+ /**
15
+ * @public
16
+ */
17
+ export const includesSymbols = (element, symbols) => {
18
+ if (symbols.length === 0) {
19
+ return true;
20
+ }
21
+ if (!element.hasAttributesProperty('symbols')) {
22
+ return false;
23
+ }
24
+ const elementSymbols = element.attributes.get('symbols');
25
+ if (!isArrayElement(elementSymbols)) {
26
+ return false;
27
+ }
28
+ return symbols.every(symbol => elementSymbols.includes(symbol));
29
+ };
30
+
31
+ /**
32
+ * @public
33
+ */
34
+ export const includesClasses = (element, classes) => {
35
+ if (classes.length === 0) {
36
+ return true;
37
+ }
38
+ if (!isElement(element)) {
39
+ return false;
40
+ }
41
+ if (element.isMetaEmpty) {
42
+ return false;
43
+ }
44
+ if (!element.hasMetaProperty('classes')) {
45
+ return false;
46
+ }
47
+ return classes.every(cls => element.classes.includes(cls));
48
+ };
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
4
+ exports.__esModule = true;
5
+ exports.isStringElement = exports.isPrimitiveElement = exports.isObjectElement = exports.isNumberElement = exports.isNullElement = exports.isMemberElement = exports.isElement = exports.isBooleanElement = exports.isArrayElement = void 0;
6
+ var _Element = _interopRequireDefault(require("../primitives/Element.cjs"));
7
+ var _StringElement = _interopRequireDefault(require("../primitives/StringElement.cjs"));
8
+ var _NumberElement = _interopRequireDefault(require("../primitives/NumberElement.cjs"));
9
+ var _NullElement = _interopRequireDefault(require("../primitives/NullElement.cjs"));
10
+ var _BooleanElement = _interopRequireDefault(require("../primitives/BooleanElement.cjs"));
11
+ var _ArrayElement = _interopRequireDefault(require("../primitives/ArrayElement.cjs"));
12
+ var _ObjectElement = _interopRequireDefault(require("../primitives/ObjectElement.cjs"));
13
+ var _MemberElement = _interopRequireDefault(require("../primitives/MemberElement.cjs"));
14
+ /**
15
+ * @public
16
+ */
17
+ const isElement = element => element instanceof _Element.default;
18
+
19
+ /**
20
+ * @public
21
+ */
22
+ exports.isElement = isElement;
23
+ const isStringElement = element => element instanceof _StringElement.default;
24
+
25
+ /**
26
+ * @public
27
+ */
28
+ exports.isStringElement = isStringElement;
29
+ const isNumberElement = element => element instanceof _NumberElement.default;
30
+
31
+ /**
32
+ * @public
33
+ */
34
+ exports.isNumberElement = isNumberElement;
35
+ const isNullElement = element => element instanceof _NullElement.default;
36
+
37
+ /**
38
+ * @public
39
+ */
40
+ exports.isNullElement = isNullElement;
41
+ const isBooleanElement = element => element instanceof _BooleanElement.default;
42
+
43
+ /**
44
+ * @public
45
+ */
46
+ exports.isBooleanElement = isBooleanElement;
47
+ const isArrayElement = element => element instanceof _ArrayElement.default;
48
+
49
+ /**
50
+ * @public
51
+ */
52
+ exports.isArrayElement = isArrayElement;
53
+ const isObjectElement = element => element instanceof _ObjectElement.default;
54
+
55
+ /**
56
+ * @public
57
+ */
58
+ exports.isObjectElement = isObjectElement;
59
+ const isMemberElement = element => element instanceof _MemberElement.default;
60
+
61
+ /**
62
+ * @public
63
+ */
64
+ exports.isMemberElement = isMemberElement;
65
+ /**
66
+ * @public
67
+ */
68
+ const isPrimitiveElement = element => isObjectElement(element) && element.element === 'object' || isArrayElement(element) && element.element === 'array' || isBooleanElement(element) && element.element === 'boolean' || isNumberElement(element) && element.element === 'number' || isStringElement(element) && element.element === 'string' || isNullElement(element) && element.element === 'null' || isMemberElement(element) && element.element === 'member';
69
+ exports.isPrimitiveElement = isPrimitiveElement;
@@ -0,0 +1,56 @@
1
+ import Element from "../primitives/Element.mjs";
2
+ import StringElement from "../primitives/StringElement.mjs";
3
+ import NumberElement from "../primitives/NumberElement.mjs";
4
+ import NullElement from "../primitives/NullElement.mjs";
5
+ import BooleanElement from "../primitives/BooleanElement.mjs";
6
+ import ArrayElement from "../primitives/ArrayElement.mjs";
7
+ import ObjectElement from "../primitives/ObjectElement.mjs";
8
+ import MemberElement from "../primitives/MemberElement.mjs";
9
+ /**
10
+ * @public
11
+ */
12
+ export const isElement = element => element instanceof Element;
13
+
14
+ /**
15
+ * @public
16
+ */
17
+ export const isStringElement = element => element instanceof StringElement;
18
+
19
+ /**
20
+ * @public
21
+ */
22
+ export const isNumberElement = element => element instanceof NumberElement;
23
+
24
+ /**
25
+ * @public
26
+ */
27
+ export const isNullElement = element => element instanceof NullElement;
28
+
29
+ /**
30
+ * @public
31
+ */
32
+ export const isBooleanElement = element => element instanceof BooleanElement;
33
+
34
+ /**
35
+ * @public
36
+ */
37
+ export const isArrayElement = element => element instanceof ArrayElement;
38
+
39
+ /**
40
+ * @public
41
+ */
42
+ export const isObjectElement = element => element instanceof ObjectElement;
43
+
44
+ /**
45
+ * @public
46
+ */
47
+ export const isMemberElement = element => element instanceof MemberElement;
48
+
49
+ /**
50
+ * @public
51
+ */
52
+
53
+ /**
54
+ * @public
55
+ */
56
+ export const isPrimitiveElement = element => isObjectElement(element) && element.element === 'object' || isArrayElement(element) && element.element === 'array' || isBooleanElement(element) && element.element === 'boolean' || isNumberElement(element) && element.element === 'number' || isStringElement(element) && element.element === 'string' || isNullElement(element) && element.element === 'null' || isMemberElement(element) && element.element === 'member';
@@ -13,13 +13,6 @@ var _CollectionElement = _interopRequireDefault(require("./CollectionElement.cjs
13
13
  * @public
14
14
  */
15
15
  class ArrayElement extends _CollectionElement.default {
16
- // Static Fantasy Land methods
17
- static empty() {
18
- return new this();
19
- }
20
- static 'fantasy-land/empty'() {
21
- return ArrayElement.empty();
22
- }
23
16
  constructor(content, meta, attributes) {
24
17
  super(content || [], meta, attributes);
25
18
  this.element = 'array';
@@ -152,25 +145,11 @@ class ArrayElement extends _CollectionElement.default {
152
145
  });
153
146
  }
154
147
 
155
- // Fantasy Land
156
-
157
148
  /**
158
149
  * Returns an empty array element.
159
150
  */
160
151
  empty() {
161
152
  return new this.constructor([]);
162
153
  }
163
- 'fantasy-land/map'(transform) {
164
- return new this.constructor(this.map(transform));
165
- }
166
- 'fantasy-land/chain'(transform) {
167
- return this.map(element => transform(element)).reduce((a, b) => a.concat(b), this.empty());
168
- }
169
- 'fantasy-land/filter'(callback) {
170
- return new this.constructor(this._content.filter(callback));
171
- }
172
- 'fantasy-land/reduce'(transform, initialValue) {
173
- return this._content.reduce(transform, initialValue);
174
- }
175
154
  }
176
155
  var _default = exports.default = ArrayElement;
@@ -6,13 +6,6 @@ import CollectionElement from "./CollectionElement.mjs"; // Re-export types from
6
6
  * @public
7
7
  */
8
8
  class ArrayElement extends CollectionElement {
9
- // Static Fantasy Land methods
10
- static empty() {
11
- return new this();
12
- }
13
- static 'fantasy-land/empty'() {
14
- return ArrayElement.empty();
15
- }
16
9
  constructor(content, meta, attributes) {
17
10
  super(content || [], meta, attributes);
18
11
  this.element = 'array';
@@ -145,25 +138,11 @@ class ArrayElement extends CollectionElement {
145
138
  });
146
139
  }
147
140
 
148
- // Fantasy Land
149
-
150
141
  /**
151
142
  * Returns an empty array element.
152
143
  */
153
144
  empty() {
154
145
  return new this.constructor([]);
155
146
  }
156
- 'fantasy-land/map'(transform) {
157
- return new this.constructor(this.map(transform));
158
- }
159
- 'fantasy-land/chain'(transform) {
160
- return this.map(element => transform(element)).reduce((a, b) => a.concat(b), this.empty());
161
- }
162
- 'fantasy-land/filter'(callback) {
163
- return new this.constructor(this._content.filter(callback));
164
- }
165
- 'fantasy-land/reduce'(transform, initialValue) {
166
- return this._content.reduce(transform, initialValue);
167
- }
168
147
  }
169
148
  export default ArrayElement;
@@ -69,20 +69,15 @@ class CollectionElement extends _Element.default {
69
69
  }
70
70
 
71
71
  /**
72
- * Adds the given element to the end of the collection.
72
+ * Adds the given elements to the end of the collection.
73
73
  */
74
- push(value) {
75
- this._content.push(this.refract(value));
74
+ push(...values) {
75
+ for (const value of values) {
76
+ this._content.push(this.refract(value));
77
+ }
76
78
  return this;
77
79
  }
78
80
 
79
- /**
80
- * Alias for push.
81
- */
82
- add(value) {
83
- this.push(value);
84
- }
85
-
86
81
  /**
87
82
  * Removes the first element from the collection.
88
83
  */
@@ -165,16 +160,10 @@ class CollectionElement extends _Element.default {
165
160
  return this.find(item => item.id.toValue() === id).first;
166
161
  }
167
162
 
168
- // Fantasy Land - Monoid
169
-
170
163
  /**
171
164
  * Returns an empty collection element.
172
165
  */
173
166
 
174
- 'fantasy-land/empty'() {
175
- return this.empty();
176
- }
177
-
178
167
  /**
179
168
  * Concatenates two collection elements.
180
169
  */
@@ -182,9 +171,6 @@ class CollectionElement extends _Element.default {
182
171
  const Ctor = this.constructor;
183
172
  return new Ctor(this._content.concat(other._content));
184
173
  }
185
- 'fantasy-land/concat'(other) {
186
- return this.concat(other);
187
- }
188
174
 
189
175
  // Iterator support
190
176
  [Symbol.iterator]() {
@@ -62,20 +62,15 @@ class CollectionElement extends Element {
62
62
  }
63
63
 
64
64
  /**
65
- * Adds the given element to the end of the collection.
65
+ * Adds the given elements to the end of the collection.
66
66
  */
67
- push(value) {
68
- this._content.push(this.refract(value));
67
+ push(...values) {
68
+ for (const value of values) {
69
+ this._content.push(this.refract(value));
70
+ }
69
71
  return this;
70
72
  }
71
73
 
72
- /**
73
- * Alias for push.
74
- */
75
- add(value) {
76
- this.push(value);
77
- }
78
-
79
74
  /**
80
75
  * Removes the first element from the collection.
81
76
  */
@@ -158,16 +153,10 @@ class CollectionElement extends Element {
158
153
  return this.find(item => item.id.toValue() === id).first;
159
154
  }
160
155
 
161
- // Fantasy Land - Monoid
162
-
163
156
  /**
164
157
  * Returns an empty collection element.
165
158
  */
166
159
 
167
- 'fantasy-land/empty'() {
168
- return this.empty();
169
- }
170
-
171
160
  /**
172
161
  * Concatenates two collection elements.
173
162
  */
@@ -175,9 +164,6 @@ class CollectionElement extends Element {
175
164
  const Ctor = this.constructor;
176
165
  return new Ctor(this._content.concat(other._content));
177
166
  }
178
- 'fantasy-land/concat'(other) {
179
- return this.concat(other);
180
- }
181
167
 
182
168
  // Iterator support
183
169
  [Symbol.iterator]() {