d272429ffcea1f8728816d89ba20a2d71551bc5e
[platform/framework/web/crosswalk-tizen.git] /
1 'use strict';
2
3 var clear          = require('es5-ext/array/#/clear')
4   , eIndexOf       = require('es5-ext/array/#/e-index-of')
5   , setPrototypeOf = require('es5-ext/object/set-prototype-of')
6   , callable       = require('es5-ext/object/valid-callable')
7   , d              = require('d')
8   , ee             = require('event-emitter')
9   , Symbol         = require('es6-symbol')
10   , iterator       = require('es6-iterator/valid-iterable')
11   , forOf          = require('es6-iterator/for-of')
12   , Iterator       = require('./lib/iterator')
13   , isNative       = require('./is-native-implemented')
14
15   , call = Function.prototype.call, defineProperty = Object.defineProperty
16   , SetPoly, getValues;
17
18 module.exports = SetPoly = function (/*iterable*/) {
19         var iterable = arguments[0];
20         if (!(this instanceof SetPoly)) return new SetPoly(iterable);
21         if (this.__setData__ !== undefined) {
22                 throw new TypeError(this + " cannot be reinitialized");
23         }
24         if (iterable != null) iterator(iterable);
25         defineProperty(this, '__setData__', d('c', []));
26         if (!iterable) return;
27         forOf(iterable, function (value) {
28                 if (eIndexOf.call(this, value) !== -1) return;
29                 this.push(value);
30         }, this.__setData__);
31 };
32
33 if (isNative) {
34         if (setPrototypeOf) setPrototypeOf(SetPoly, Set);
35         SetPoly.prototype = Object.create(Set.prototype, {
36                 constructor: d(SetPoly)
37         });
38 }
39
40 ee(Object.defineProperties(SetPoly.prototype, {
41         add: d(function (value) {
42                 if (this.has(value)) return this;
43                 this.emit('_add', this.__setData__.push(value) - 1, value);
44                 return this;
45         }),
46         clear: d(function () {
47                 if (!this.__setData__.length) return;
48                 clear.call(this.__setData__);
49                 this.emit('_clear');
50         }),
51         delete: d(function (value) {
52                 var index = eIndexOf.call(this.__setData__, value);
53                 if (index === -1) return false;
54                 this.__setData__.splice(index, 1);
55                 this.emit('_delete', index, value);
56                 return true;
57         }),
58         entries: d(function () { return new Iterator(this, 'key+value'); }),
59         forEach: d(function (cb/*, thisArg*/) {
60                 var thisArg = arguments[1], iterator, result, value;
61                 callable(cb);
62                 iterator = this.values();
63                 result = iterator._next();
64                 while (result !== undefined) {
65                         value = iterator._resolve(result);
66                         call.call(cb, thisArg, value, value, this);
67                         result = iterator._next();
68                 }
69         }),
70         has: d(function (value) {
71                 return (eIndexOf.call(this.__setData__, value) !== -1);
72         }),
73         keys: d(getValues = function () { return this.values(); }),
74         size: d.gs(function () { return this.__setData__.length; }),
75         values: d(function () { return new Iterator(this); }),
76         toString: d(function () { return '[object Set]'; })
77 }));
78 defineProperty(SetPoly.prototype, Symbol.iterator, d(getValues));
79 defineProperty(SetPoly.prototype, Symbol.toStringTag, d('c', 'Set'));