deep-iterator
Version:
Deep iteration of any object or iterable collection.
182 lines (168 loc) • 10.8 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _generators = require('./generators');
var _tag = require('./tag');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var Node = function () {
function Node(key, value, parentNode, isCircular) {
(0, _classCallCheck3.default)(this, Node);
this._value = value;
this._key = key;
this._parent = parentNode.value, this._parentNode = parentNode;
this._selectGenerator = parentNode._selectGenerator;
this._tag = (0, _tag.getTag)(value);
this._generator = this._selectGenerator.getGenerator(this._tag);
this._isCircular = isCircular;
this._isLeaf = this._generator === _generators.LEAF || this._isCircular;
if (!this._isLeaf && this._selectGenerator.skipIteration(this)) {
this._isLeaf = true;
this._generator = _generators.LEAF;
}
}
(0, _createClass3.default)(Node, [{
key: 'createIterator',
value: function createIterator() {
if (this._generator === _generators.LEAF) {
throw new Error("createIterator called on a non iterable node.");
}
return this._generator(this.value);
}
}, {
key: 'isCircular',
value: function isCircular() {
return this._isCircular;
}
}, {
key: 'isLeaf',
value: function isLeaf() {
return this._isLeaf;
}
}, {
key: 'isNull',
value: function isNull() {
return this.type === 'Null';
}
}, {
key: 'isUndefined',
value: function isUndefined() {
return this.type === 'Undefined';
}
}, {
key: 'isBoolean',
value: function isBoolean() {
return this.type === 'Boolean';
}
}, {
key: 'isNumber',
value: function isNumber() {
return this.type === 'Number';
}
}, {
key: 'isString',
value: function isString() {
return this.type === 'String';
}
}, {
key: 'isSymbol',
value: function isSymbol() {
return this.type === 'Symbol';
}
}, {
key: 'isDate',
value: function isDate() {
return this.type === 'Date';
}
}, {
key: 'isRegExp',
value: function isRegExp() {
return this.type === 'RegExp';
}
}, {
key: 'isFunction',
value: function isFunction() {
return this.type === 'Function';
}
}, {
key: 'isGeneratorFunction',
value: function isGeneratorFunction() {
return this.type === 'GeneratorFunction';
}
}, {
key: 'isPromise',
value: function isPromise() {
return this.type === 'Promise';
}
}, {
key: 'isArray',
value: function isArray() {
return this.type === 'Array';
}
}, {
key: 'isSet',
value: function isSet() {
return this.type === 'Set';
}
}, {
key: 'isMap',
value: function isMap() {
return this.type === 'Map';
}
}, {
key: 'isUserDefinedIterable',
value: function isUserDefinedIterable() {
return this.type === 'UserDefinedIterable';
}
}, {
key: 'isNonIterableObject',
value: function isNonIterableObject() {
return this.type === 'NonIterableObject';
}
}, {
key: 'value',
get: function get() {
return this._value;
}
}, {
key: 'key',
get: function get() {
return this._key;
}
}, {
key: 'parent',
get: function get() {
return this._parent;
}
}, {
key: 'parentNode',
get: function get() {
return this._parentNode;
}
}, {
key: 'path',
get: function get() {
// evaluated only when needed - could memoize it
return [].concat((0, _toConsumableArray3.default)(this.parentNode.path), [this.key]);
}
}, {
key: 'type',
get: function get() {
// simple memoization
/* istanbul ignore next */
if (this._type === undefined) {
this._type = (0, _tag.getTypeFromTag)(this._tag);
}
return this._type;
}
}]);
return Node;
}();
exports.default = Node;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9ub2RlLmpzIl0sIm5hbWVzIjpbIk5vZGUiLCJrZXkiLCJ2YWx1ZSIsInBhcmVudE5vZGUiLCJpc0NpcmN1bGFyIiwiX3ZhbHVlIiwiX2tleSIsIl9wYXJlbnQiLCJfcGFyZW50Tm9kZSIsIl9zZWxlY3RHZW5lcmF0b3IiLCJfdGFnIiwiX2dlbmVyYXRvciIsImdldEdlbmVyYXRvciIsIl9pc0NpcmN1bGFyIiwiX2lzTGVhZiIsInNraXBJdGVyYXRpb24iLCJFcnJvciIsInR5cGUiLCJwYXRoIiwiX3R5cGUiLCJ1bmRlZmluZWQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOzs7O0lBR3FCQSxJO0FBQ25CLGdCQUFZQyxHQUFaLEVBQWlCQyxLQUFqQixFQUF3QkMsVUFBeEIsRUFBb0NDLFVBQXBDLEVBQWdEO0FBQUE7O0FBQzlDLFNBQUtDLE1BQUwsR0FBY0gsS0FBZDtBQUNBLFNBQUtJLElBQUwsR0FBWUwsR0FBWjtBQUNBLFNBQUtNLE9BQUwsR0FBZUosV0FBV0QsS0FBMUIsRUFDQSxLQUFLTSxXQUFMLEdBQW1CTCxVQURuQjtBQUVBLFNBQUtNLGdCQUFMLEdBQXdCTixXQUFXTSxnQkFBbkM7QUFDQSxTQUFLQyxJQUFMLEdBQVksaUJBQU9SLEtBQVAsQ0FBWjtBQUNBLFNBQUtTLFVBQUwsR0FBa0IsS0FBS0YsZ0JBQUwsQ0FBc0JHLFlBQXRCLENBQW1DLEtBQUtGLElBQXhDLENBQWxCO0FBQ0EsU0FBS0csV0FBTCxHQUFtQlQsVUFBbkI7QUFDQSxTQUFLVSxPQUFMLEdBQWUsS0FBS0gsVUFBTCx5QkFBNEIsS0FBS0UsV0FBaEQ7QUFDQSxRQUFJLENBQUMsS0FBS0MsT0FBTixJQUFpQixLQUFLTCxnQkFBTCxDQUFzQk0sYUFBdEIsQ0FBb0MsSUFBcEMsQ0FBckIsRUFBZ0U7QUFDOUQsV0FBS0QsT0FBTCxHQUFlLElBQWY7QUFDQSxXQUFLSCxVQUFMO0FBQ0Q7QUFDRjs7OztxQ0FFZ0I7QUFDZixVQUFJLEtBQUtBLFVBQUwscUJBQUosRUFBOEI7QUFDNUIsY0FBTSxJQUFJSyxLQUFKLENBQVUsK0NBQVYsQ0FBTjtBQUNEO0FBQ0QsYUFBTyxLQUFLTCxVQUFMLENBQWdCLEtBQUtULEtBQXJCLENBQVA7QUFDRDs7O2lDQStCWTtBQUNYLGFBQU8sS0FBS1csV0FBWjtBQUNEOzs7NkJBRVE7QUFDUCxhQUFPLEtBQUtDLE9BQVo7QUFDRDs7OzZCQUVRO0FBQ1AsYUFBTyxLQUFLRyxJQUFMLEtBQWMsTUFBckI7QUFDRDs7O2tDQUVhO0FBQ1osYUFBTyxLQUFLQSxJQUFMLEtBQWMsV0FBckI7QUFDRDs7O2dDQUVXO0FBQ1YsYUFBTyxLQUFLQSxJQUFMLEtBQWMsU0FBckI7QUFDRDs7OytCQUVVO0FBQ1QsYUFBTyxLQUFLQSxJQUFMLEtBQWMsUUFBckI7QUFDRDs7OytCQUVVO0FBQ1QsYUFBTyxLQUFLQSxJQUFMLEtBQWMsUUFBckI7QUFDRDs7OytCQUVVO0FBQ1QsYUFBTyxLQUFLQSxJQUFMLEtBQWMsUUFBckI7QUFDRDs7OzZCQUVRO0FBQ1AsYUFBTyxLQUFLQSxJQUFMLEtBQWMsTUFBckI7QUFDRDs7OytCQUVVO0FBQ1QsYUFBTyxLQUFLQSxJQUFMLEtBQWMsUUFBckI7QUFDRDs7O2lDQUVZO0FBQ1gsYUFBTyxLQUFLQSxJQUFMLEtBQWMsVUFBckI7QUFDRDs7OzBDQUVxQjtBQUNwQixhQUFPLEtBQUtBLElBQUwsS0FBYyxtQkFBckI7QUFDRDs7O2dDQUVXO0FBQ1YsYUFBTyxLQUFLQSxJQUFMLEtBQWMsU0FBckI7QUFDRDs7OzhCQUVTO0FBQ1IsYUFBTyxLQUFLQSxJQUFMLEtBQWMsT0FBckI7QUFDRDs7OzRCQUVPO0FBQ04sYUFBTyxLQUFLQSxJQUFMLEtBQWMsS0FBckI7QUFDRDs7OzRCQUVPO0FBQ04sYUFBTyxLQUFLQSxJQUFMLEtBQWMsS0FBckI7QUFDRDs7OzRDQUV1QjtBQUN0QixhQUFPLEtBQUtBLElBQUwsS0FBYyxxQkFBckI7QUFDRDs7OzBDQUVxQjtBQUNwQixhQUFPLEtBQUtBLElBQUwsS0FBYyxtQkFBckI7QUFDRDs7O3dCQW5HVztBQUNWLGFBQU8sS0FBS1osTUFBWjtBQUNEOzs7d0JBRVM7QUFDUixhQUFPLEtBQUtDLElBQVo7QUFDRDs7O3dCQUVZO0FBQ1gsYUFBTyxLQUFLQyxPQUFaO0FBQ0Q7Ozt3QkFFZ0I7QUFDZixhQUFPLEtBQUtDLFdBQVo7QUFDRDs7O3dCQUVVO0FBQUU7QUFDWCx3REFBVyxLQUFLTCxVQUFMLENBQWdCZSxJQUEzQixJQUFpQyxLQUFLakIsR0FBdEM7QUFDRDs7O3dCQUVVO0FBQ1Q7QUFDQTtBQUNBLFVBQUksS0FBS2tCLEtBQUwsS0FBZUMsU0FBbkIsRUFBOEI7QUFDNUIsYUFBS0QsS0FBTCxHQUFhLHlCQUFlLEtBQUtULElBQXBCLENBQWI7QUFDRDtBQUNELGFBQU8sS0FBS1MsS0FBWjtBQUNEOzs7OztrQkFuRGtCbkIsSSIsImZpbGUiOiJub2RlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtMRUFGfSBmcm9tICcuL2dlbmVyYXRvcnMnO1xuaW1wb3J0IHtnZXRUYWcsIGdldFR5cGVGcm9tVGFnfSBmcm9tICcuL3RhZyc7XG5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTm9kZSB7XG4gIGNvbnN0cnVjdG9yKGtleSwgdmFsdWUsIHBhcmVudE5vZGUsIGlzQ2lyY3VsYXIpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuX2tleSA9IGtleTtcbiAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnROb2RlLnZhbHVlLFxuICAgIHRoaXMuX3BhcmVudE5vZGUgPSBwYXJlbnROb2RlO1xuICAgIHRoaXMuX3NlbGVjdEdlbmVyYXRvciA9IHBhcmVudE5vZGUuX3NlbGVjdEdlbmVyYXRvcjtcbiAgICB0aGlzLl90YWcgPSBnZXRUYWcodmFsdWUpO1xuICAgIHRoaXMuX2dlbmVyYXRvciA9IHRoaXMuX3NlbGVjdEdlbmVyYXRvci5nZXRHZW5lcmF0b3IodGhpcy5fdGFnKTtcbiAgICB0aGlzLl9pc0NpcmN1bGFyID0gaXNDaXJjdWxhcjtcbiAgICB0aGlzLl9pc0xlYWYgPSB0aGlzLl9nZW5lcmF0b3IgPT09IExFQUYgfHwgdGhpcy5faXNDaXJjdWxhcjtcbiAgICBpZiAoIXRoaXMuX2lzTGVhZiAmJiB0aGlzLl9zZWxlY3RHZW5lcmF0b3Iuc2tpcEl0ZXJhdGlvbih0aGlzKSkge1xuICAgICAgdGhpcy5faXNMZWFmID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2dlbmVyYXRvciA9IExFQUY7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlSXRlcmF0b3IoKSB7XG4gICAgaWYgKHRoaXMuX2dlbmVyYXRvciA9PT0gTEVBRikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY3JlYXRlSXRlcmF0b3IgY2FsbGVkIG9uIGEgbm9uIGl0ZXJhYmxlIG5vZGUuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZ2VuZXJhdG9yKHRoaXMudmFsdWUpO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIGdldCBrZXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2tleTtcbiAgfVxuXG4gIGdldCBwYXJlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudDtcbiAgfVxuXG4gIGdldCBwYXJlbnROb2RlKCkge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnROb2RlO1xuICB9XG5cbiAgZ2V0IHBhdGgoKSB7IC8vIGV2YWx1YXRlZCBvbmx5IHdoZW4gbmVlZGVkIC0gY291bGQgbWVtb2l6ZSBpdFxuICAgIHJldHVybiBbLi4udGhpcy5wYXJlbnROb2RlLnBhdGgsIHRoaXMua2V5XTtcbiAgfVxuXG4gIGdldCB0eXBlKCkge1xuICAgIC8vIHNpbXBsZSBtZW1vaXphdGlvblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHRoaXMuX3R5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fdHlwZSA9IGdldFR5cGVGcm9tVGFnKHRoaXMuX3RhZyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl90eXBlO1xuICB9XG5cbiAgaXNDaXJjdWxhcigpIHtcbiAgICByZXR1cm4gdGhpcy5faXNDaXJjdWxhcjtcbiAgfVxuXG4gIGlzTGVhZigpIHtcbiAgICByZXR1cm4gdGhpcy5faXNMZWFmO1xuICB9XG5cbiAgaXNOdWxsKCkge1xuICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdOdWxsJztcbiAgfVxuXG4gIGlzVW5kZWZpbmVkKCkge1xuICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdVbmRlZmluZWQnO1xuICB9XG5cbiAgaXNCb29sZWFuKCkge1xuICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdCb29sZWFuJztcbiAgfVxuXG4gIGlzTnVtYmVyKCkge1xuICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdOdW1iZXInO1xuICB9XG5cbiAgaXNTdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ1N0cmluZyc7XG4gIH1cblxuICBpc1N5bWJvbCgpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlID09PSAnU3ltYm9sJztcbiAgfVxuXG4gIGlzRGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlID09PSAnRGF0ZSc7XG4gIH1cblxuICBpc1JlZ0V4cCgpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlID09PSAnUmVnRXhwJztcbiAgfVxuXG4gIGlzRnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ0Z1bmN0aW9uJztcbiAgfVxuXG4gIGlzR2VuZXJhdG9yRnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ0dlbmVyYXRvckZ1bmN0aW9uJztcbiAgfVxuXG4gIGlzUHJvbWlzZSgpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlID09PSAnUHJvbWlzZSc7XG4gIH1cblxuICBpc0FycmF5KCkge1xuICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdBcnJheSc7XG4gIH1cblxuICBpc1NldCgpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlID09PSAnU2V0JztcbiAgfVxuXG4gIGlzTWFwKCkge1xuICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdNYXAnO1xuICB9XG5cbiAgaXNVc2VyRGVmaW5lZEl0ZXJhYmxlKCkge1xuICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdVc2VyRGVmaW5lZEl0ZXJhYmxlJztcbiAgfVxuXG4gIGlzTm9uSXRlcmFibGVPYmplY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ05vbkl0ZXJhYmxlT2JqZWN0JztcbiAgfVxuXG59XG4iXX0=