iteragain
Version:
Javascript Iterable/Iterator/Generator-function utilities.
56 lines • 2.18 kB
JavaScript
import ConcatIterator from './ConcatIterator';
import RepeatIterator from './RepeatIterator';
/**
* Iterates through all keys in an object. Optionally provides traversal order. Does not support circular references and
* will throw a RangeError with max call stack exceeded.
* @todo // TODO: Add support for BFS traversal order.
*/
var ObjectIterator = /** @class */ (function () {
function ObjectIterator(object, traversal) {
if (traversal === void 0) { traversal = 'post-order-DFS'; }
this.traversal = traversal;
this.inner = null;
this.arr = [];
this.push(object);
}
ObjectIterator.prototype[Symbol.iterator] = function () {
return this;
};
ObjectIterator.prototype.next = function () {
var _a;
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
if (this.inner) {
var next_1 = (_a = this.inner).next.apply(_a, args);
if (!next_1.done)
return next_1;
this.inner = null;
return this.next.apply(this, args);
}
if (!this.arr.length)
return { done: true, value: undefined };
var next = this.arr.shift(); // Previous line ensures this is not undefined.
if (this.isObject(next[1])) {
this.inner = new ConcatIterator(this.traversal === 'post-order-DFS'
? [new ObjectIterator(next[1]), new RepeatIterator(next, 1)]
: [new RepeatIterator(next, 1), new ObjectIterator(next[1])]);
return this.next.apply(this, args);
}
return { value: next, done: false };
};
ObjectIterator.prototype.isObject = function (value) {
return typeof value === 'object' && value !== null;
};
ObjectIterator.prototype.push = function (obj) {
for (var _i = 0, _a = Object.keys(obj); _i < _a.length; _i++) {
var key = _a[_i];
this.arr.push([key, obj[key], obj]);
}
};
return ObjectIterator;
}());
export { ObjectIterator };
export default ObjectIterator;
//# sourceMappingURL=ObjectIterator.js.map