primitive-iterator.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. "use strict";
  2. var clear = require("es5-ext/array/#/clear")
  3. , assign = require("es5-ext/object/assign")
  4. , setPrototypeOf = require("es5-ext/object/set-prototype-of")
  5. , contains = require("es5-ext/string/#/contains")
  6. , d = require("d")
  7. , autoBind = require("d/auto-bind")
  8. , Iterator = require("es6-iterator")
  9. , toStringTagSymbol = require("es6-symbol").toStringTag
  10. , defineProperties = Object.defineProperties
  11. , keys = Object.keys
  12. , unBind = Iterator.prototype._unBind
  13. , PrimitiveSetIterator;
  14. PrimitiveSetIterator = module.exports = function (set, kind) {
  15. if (!(this instanceof PrimitiveSetIterator)) {
  16. return new PrimitiveSetIterator(set, kind);
  17. }
  18. Iterator.call(this, keys(set.__setData__), set);
  19. kind = !kind || !contains.call(kind, "key+value") ? "value" : "key+value";
  20. return defineProperties(this, { __kind__: d("", kind), __data__: d("w", set.__setData__) });
  21. };
  22. if (setPrototypeOf) setPrototypeOf(PrimitiveSetIterator, Iterator);
  23. PrimitiveSetIterator.prototype = Object.create(
  24. Iterator.prototype,
  25. assign(
  26. {
  27. constructor: d(PrimitiveSetIterator),
  28. _resolve: d(function (i) {
  29. var value = this.__data__[this.__list__[i]];
  30. return this.__kind__ === "value" ? value : [value, value];
  31. }),
  32. _unBind: d(function () {
  33. this.__data__ = null;
  34. unBind.call(this);
  35. }),
  36. toString: d(function () { return "[object Set Iterator]"; })
  37. },
  38. autoBind({
  39. _onAdd: d(function (key) { this.__list__.push(key); }),
  40. _onDelete: d(function (key) {
  41. var index = this.__list__.lastIndexOf(key);
  42. if (index < this.__nextIndex__) return;
  43. this.__list__.splice(index, 1);
  44. }),
  45. _onClear: d(function () {
  46. clear.call(this.__list__);
  47. this.__nextIndex__ = 0;
  48. })
  49. })
  50. )
  51. );
  52. Object.defineProperty(PrimitiveSetIterator.prototype, toStringTagSymbol, d("c", "Set Iterator"));