index.js 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. "use strict";
  2. var isValue = require("type/value/is")
  3. , callable = require("es5-ext/object/valid-callable")
  4. , clear = require("es5-ext/object/clear")
  5. , setPrototypeOf = require("es5-ext/object/set-prototype-of")
  6. , d = require("d")
  7. , iterator = require("es6-iterator/valid-iterable")
  8. , forOf = require("es6-iterator/for-of")
  9. , SetPolyfill = require("../polyfill")
  10. , Iterator = require("../lib/primitive-iterator")
  11. , isNative = require("../is-native-implemented")
  12. , create = Object.create
  13. , defineProperties = Object.defineProperties
  14. , defineProperty = Object.defineProperty
  15. , getPrototypeOf = Object.getPrototypeOf
  16. , objHasOwnProperty = Object.prototype.hasOwnProperty
  17. , PrimitiveSet;
  18. module.exports = PrimitiveSet = function (/* iterable, serialize*/) {
  19. var iterable = arguments[0], serialize = arguments[1], self;
  20. if (!(this instanceof PrimitiveSet)) throw new TypeError("Constructor requires 'new'");
  21. if (isNative && setPrototypeOf) self = setPrototypeOf(new SetPolyfill(), getPrototypeOf(this));
  22. else self = this;
  23. if (isValue(iterable)) iterator(iterable);
  24. if (serialize !== undefined) {
  25. callable(serialize);
  26. defineProperty(self, "_serialize", d("", serialize));
  27. }
  28. defineProperties(self, { __setData__: d("c", create(null)), __size__: d("w", 0) });
  29. if (!iterable) return self;
  30. forOf(iterable, function (value) {
  31. var key = self._serialize(value);
  32. if (!isValue(key)) throw new TypeError(value + " cannot be serialized");
  33. if (objHasOwnProperty.call(self.__setData__, key)) return;
  34. self.__setData__[key] = value;
  35. ++self.__size__;
  36. });
  37. return self;
  38. };
  39. if (setPrototypeOf) setPrototypeOf(PrimitiveSet, SetPolyfill);
  40. PrimitiveSet.prototype = create(SetPolyfill.prototype, {
  41. constructor: d(PrimitiveSet),
  42. _serialize: d(function (value) {
  43. if (value && typeof value.toString !== "function") return null;
  44. return String(value);
  45. }),
  46. add: d(function (value) {
  47. var key = this._serialize(value);
  48. if (!isValue(key)) throw new TypeError(value + " cannot be serialized");
  49. if (objHasOwnProperty.call(this.__setData__, key)) return this;
  50. this.__setData__[key] = value;
  51. ++this.__size__;
  52. this.emit("_add", key);
  53. return this;
  54. }),
  55. clear: d(function () {
  56. if (!this.__size__) return;
  57. clear(this.__setData__);
  58. this.__size__ = 0;
  59. this.emit("_clear");
  60. }),
  61. delete: d(function (value) {
  62. var key = this._serialize(value);
  63. if (!isValue(key)) return false;
  64. if (!objHasOwnProperty.call(this.__setData__, key)) return false;
  65. delete this.__setData__[key];
  66. --this.__size__;
  67. this.emit("_delete", key);
  68. return true;
  69. }),
  70. entries: d(function () { return new Iterator(this, "key+value"); }),
  71. get: d(function (key) {
  72. key = this._serialize(key);
  73. if (!isValue(key)) return undefined;
  74. return this.__setData__[key];
  75. }),
  76. has: d(function (value) {
  77. var key = this._serialize(value);
  78. if (!isValue(key)) return false;
  79. return objHasOwnProperty.call(this.__setData__, key);
  80. }),
  81. size: d.gs(function () { return this.__size__; }),
  82. values: d(function () { return new Iterator(this); })
  83. });