Spaces:
Runtime error
Runtime error
; | |
var clear = require("es5-ext/array/#/clear") | |
, assign = require("es5-ext/object/assign") | |
, callable = require("es5-ext/object/valid-callable") | |
, value = require("es5-ext/object/valid-value") | |
, d = require("d") | |
, autoBind = require("d/auto-bind") | |
, Symbol = require("es6-symbol"); | |
var defineProperty = Object.defineProperty, defineProperties = Object.defineProperties, Iterator; | |
module.exports = Iterator = function (list, context) { | |
if (!(this instanceof Iterator)) throw new TypeError("Constructor requires 'new'"); | |
defineProperties(this, { | |
__list__: d("w", value(list)), | |
__context__: d("w", context), | |
__nextIndex__: d("w", 0) | |
}); | |
if (!context) return; | |
callable(context.on); | |
context.on("_add", this._onAdd); | |
context.on("_delete", this._onDelete); | |
context.on("_clear", this._onClear); | |
}; | |
// Internal %IteratorPrototype% doesn't expose its constructor | |
delete Iterator.prototype.constructor; | |
defineProperties( | |
Iterator.prototype, | |
assign( | |
{ | |
_next: d(function () { | |
var i; | |
if (!this.__list__) return undefined; | |
if (this.__redo__) { | |
i = this.__redo__.shift(); | |
if (i !== undefined) return i; | |
} | |
if (this.__nextIndex__ < this.__list__.length) return this.__nextIndex__++; | |
this._unBind(); | |
return undefined; | |
}), | |
next: d(function () { | |
return this._createResult(this._next()); | |
}), | |
_createResult: d(function (i) { | |
if (i === undefined) return { done: true, value: undefined }; | |
return { done: false, value: this._resolve(i) }; | |
}), | |
_resolve: d(function (i) { | |
return this.__list__[i]; | |
}), | |
_unBind: d(function () { | |
this.__list__ = null; | |
delete this.__redo__; | |
if (!this.__context__) return; | |
this.__context__.off("_add", this._onAdd); | |
this.__context__.off("_delete", this._onDelete); | |
this.__context__.off("_clear", this._onClear); | |
this.__context__ = null; | |
}), | |
toString: d(function () { | |
return "[object " + (this[Symbol.toStringTag] || "Object") + "]"; | |
}) | |
}, | |
autoBind({ | |
_onAdd: d(function (index) { | |
if (index >= this.__nextIndex__) return; | |
++this.__nextIndex__; | |
if (!this.__redo__) { | |
defineProperty(this, "__redo__", d("c", [index])); | |
return; | |
} | |
this.__redo__.forEach(function (redo, i) { | |
if (redo >= index) this.__redo__[i] = ++redo; | |
}, this); | |
this.__redo__.push(index); | |
}), | |
_onDelete: d(function (index) { | |
var i; | |
if (index >= this.__nextIndex__) return; | |
--this.__nextIndex__; | |
if (!this.__redo__) return; | |
i = this.__redo__.indexOf(index); | |
if (i !== -1) this.__redo__.splice(i, 1); | |
this.__redo__.forEach(function (redo, j) { | |
if (redo > index) this.__redo__[j] = --redo; | |
}, this); | |
}), | |
_onClear: d(function () { | |
if (this.__redo__) clear.call(this.__redo__); | |
this.__nextIndex__ = 0; | |
}) | |
}) | |
) | |
); | |
defineProperty( | |
Iterator.prototype, | |
Symbol.iterator, | |
d(function () { | |
return this; | |
}) | |
); | |