set.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444
  1. /**
  2. * @constructor
  3. * @param {Array.<Object>} S
  4. */
  5. Sk.builtin.set = function (S) {
  6. var it, i;
  7. var S_list;
  8. if (!(this instanceof Sk.builtin.set)) {
  9. return new Sk.builtin.set(S);
  10. }
  11. if (typeof(S) === "undefined") {
  12. S = [];
  13. }
  14. this.set_reset_();
  15. S_list = new Sk.builtin.list(S);
  16. // python sorts sets on init, but not thereafter.
  17. // Skulpt seems to init a new set each time you add/remove something
  18. //Sk.builtin.list.prototype['sort'].func_code(S);
  19. for (it = Sk.abstr.iter(S_list), i = it.tp$iternext(); i !== undefined; i = it.tp$iternext()) {
  20. Sk.builtin.set.prototype["add"].func_code(this, i);
  21. }
  22. this.__class__ = Sk.builtin.set;
  23. this["v"] = this.v;
  24. return this;
  25. };
  26. Sk.abstr.setUpInheritance("set", Sk.builtin.set, Sk.builtin.object);
  27. Sk.abstr.markUnhashable(Sk.builtin.set);
  28. Sk.builtin.set.prototype.set_reset_ = function () {
  29. this.v = new Sk.builtin.dict([]);
  30. };
  31. Sk.builtin.set.prototype["$r"] = function () {
  32. var it, i;
  33. var ret = [];
  34. for (it = Sk.abstr.iter(this), i = it.tp$iternext(); i !== undefined; i = it.tp$iternext()) {
  35. ret.push(Sk.misceval.objectRepr(i).v);
  36. }
  37. if(Sk.python3) {
  38. return new Sk.builtin.str("{" + ret.join(", ") + "}");
  39. } else {
  40. return new Sk.builtin.str("set([" + ret.join(", ") + "])");
  41. }
  42. };
  43. Sk.builtin.set.prototype.ob$eq = function (other) {
  44. if (this === other) {
  45. return Sk.builtin.bool.true$;
  46. }
  47. if (!(other instanceof Sk.builtin.set)) {
  48. return Sk.builtin.bool.false$;
  49. }
  50. if (Sk.builtin.set.prototype.sq$length.call(this) !==
  51. Sk.builtin.set.prototype.sq$length.call(other)) {
  52. return Sk.builtin.bool.false$;
  53. }
  54. return this["issubset"].func_code(this, other);
  55. };
  56. Sk.builtin.set.prototype.ob$ne = function (other) {
  57. if (this === other) {
  58. return Sk.builtin.bool.false$;
  59. }
  60. if (!(other instanceof Sk.builtin.set)) {
  61. return Sk.builtin.bool.true$;
  62. }
  63. if (Sk.builtin.set.prototype.sq$length.call(this) !==
  64. Sk.builtin.set.prototype.sq$length.call(other)) {
  65. return Sk.builtin.bool.true$;
  66. }
  67. if (this["issubset"].func_code(this, other).v) {
  68. return Sk.builtin.bool.false$;
  69. } else {
  70. return Sk.builtin.bool.true$;
  71. }
  72. };
  73. Sk.builtin.set.prototype.ob$lt = function (other) {
  74. if (this === other) {
  75. return Sk.builtin.bool.false$;
  76. }
  77. if (Sk.builtin.set.prototype.sq$length.call(this) >=
  78. Sk.builtin.set.prototype.sq$length.call(other)) {
  79. return Sk.builtin.bool.false$;
  80. }
  81. return this["issubset"].func_code(this, other);
  82. };
  83. Sk.builtin.set.prototype.ob$le = function (other) {
  84. if (this === other) {
  85. return Sk.builtin.bool.true$;
  86. }
  87. if (Sk.builtin.set.prototype.sq$length.call(this) >
  88. Sk.builtin.set.prototype.sq$length.call(other)) {
  89. return Sk.builtin.bool.false$;
  90. }
  91. return this["issubset"].func_code(this, other);
  92. };
  93. Sk.builtin.set.prototype.ob$gt = function (other) {
  94. if (this === other) {
  95. return Sk.builtin.bool.false$;
  96. }
  97. if (Sk.builtin.set.prototype.sq$length.call(this) <=
  98. Sk.builtin.set.prototype.sq$length.call(other)) {
  99. return Sk.builtin.bool.false$;
  100. }
  101. return this["issuperset"].func_code(this, other);
  102. };
  103. Sk.builtin.set.prototype.ob$ge = function (other) {
  104. if (this === other) {
  105. return Sk.builtin.bool.true$;
  106. }
  107. if (Sk.builtin.set.prototype.sq$length.call(this) <
  108. Sk.builtin.set.prototype.sq$length.call(other)) {
  109. return Sk.builtin.bool.false$;
  110. }
  111. return this["issuperset"].func_code(this, other);
  112. };
  113. Sk.builtin.set.prototype["__iter__"] = new Sk.builtin.func(function (self) {
  114. Sk.builtin.pyCheckArgs("__iter__", arguments, 0, 0, false, true);
  115. return new Sk.builtin.set_iter_(self);
  116. });
  117. Sk.builtin.set.prototype.tp$iter = function () {
  118. return new Sk.builtin.set_iter_(this);
  119. };
  120. Sk.builtin.set.prototype.sq$length = function () {
  121. return this["v"].mp$length();
  122. };
  123. Sk.builtin.set.prototype.sq$contains = function(ob) {
  124. return this["v"].sq$contains(ob);
  125. };
  126. Sk.builtin.set.prototype["isdisjoint"] = new Sk.builtin.func(function (self, other) {
  127. // requires all items in self to not be in other
  128. var isIn;
  129. var it, item;
  130. Sk.builtin.pyCheckArgs("isdisjoint", arguments, 2, 2);
  131. if (!Sk.builtin.checkIterable(other)) {
  132. throw new Sk.builtin.TypeError("'" + Sk.abstr.typeName(other) + "' object is not iterable");
  133. }
  134. for (it = Sk.abstr.iter(self), item = it.tp$iternext(); item !== undefined; item = it.tp$iternext()) {
  135. isIn = Sk.abstr.sequenceContains(other, item);
  136. if (isIn) {
  137. return Sk.builtin.bool.false$;
  138. }
  139. }
  140. return Sk.builtin.bool.true$;
  141. });
  142. Sk.builtin.set.prototype["issubset"] = new Sk.builtin.func(function (self, other) {
  143. var isIn;
  144. var it, item;
  145. var selfLength, otherLength;
  146. Sk.builtin.pyCheckArgs("issubset", arguments, 2, 2);
  147. if (!Sk.builtin.checkIterable(other)) {
  148. throw new Sk.builtin.TypeError("'" + Sk.abstr.typeName(other) + "' object is not iterable");
  149. }
  150. selfLength = self.sq$length();
  151. otherLength = other.sq$length();
  152. if (selfLength > otherLength) {
  153. // every item in this set can't be in other if it's shorter!
  154. return Sk.builtin.bool.false$;
  155. }
  156. for (it = Sk.abstr.iter(self), item = it.tp$iternext(); item !== undefined; item = it.tp$iternext()) {
  157. isIn = Sk.abstr.sequenceContains(other, item);
  158. if (!isIn) {
  159. return Sk.builtin.bool.false$;
  160. }
  161. }
  162. return Sk.builtin.bool.true$;
  163. });
  164. Sk.builtin.set.prototype["issuperset"] = new Sk.builtin.func(function (self, other) {
  165. Sk.builtin.pyCheckArgs("issuperset", arguments, 2, 2);
  166. return Sk.builtin.set.prototype["issubset"].func_code(other, self);
  167. });
  168. Sk.builtin.set.prototype["union"] = new Sk.builtin.func(function (self) {
  169. var S, i, new_args;
  170. Sk.builtin.pyCheckArgs("union", arguments, 1);
  171. S = Sk.builtin.set.prototype["copy"].func_code(self);
  172. new_args = [S];
  173. for (i = 1; i < arguments.length; i++) {
  174. new_args.push(arguments[i]);
  175. }
  176. Sk.builtin.set.prototype["update"].func_code.apply(null, new_args);
  177. return S;
  178. });
  179. Sk.builtin.set.prototype["intersection"] = new Sk.builtin.func(function (self) {
  180. var S, i, new_args;
  181. Sk.builtin.pyCheckArgs("intersection", arguments, 1);
  182. S = Sk.builtin.set.prototype["copy"].func_code(self);
  183. new_args = [S];
  184. for (i = 1; i < arguments.length; i++) {
  185. new_args.push(arguments[i]);
  186. }
  187. Sk.builtin.set.prototype["intersection_update"].func_code.apply(null, new_args);
  188. return S;
  189. });
  190. Sk.builtin.set.prototype["difference"] = new Sk.builtin.func(function (self, other) {
  191. var S, i, new_args;
  192. Sk.builtin.pyCheckArgs("difference", arguments, 2);
  193. S = Sk.builtin.set.prototype["copy"].func_code(self);
  194. new_args = [S];
  195. for (i = 1; i < arguments.length; i++) {
  196. new_args.push(arguments[i]);
  197. }
  198. Sk.builtin.set.prototype["difference_update"].func_code.apply(null, new_args);
  199. return S;
  200. });
  201. Sk.builtin.set.prototype["symmetric_difference"] = new Sk.builtin.func(function (self, other) {
  202. var it, item, S;
  203. Sk.builtin.pyCheckArgs("symmetric_difference", arguments, 2, 2);
  204. S = Sk.builtin.set.prototype["union"].func_code(self, other);
  205. for (it = Sk.abstr.iter(S), item = it.tp$iternext(); item !== undefined; item = it.tp$iternext()) {
  206. if (Sk.abstr.sequenceContains(self, item) && Sk.abstr.sequenceContains(other, item)) {
  207. Sk.builtin.set.prototype["discard"].func_code(S, item);
  208. }
  209. }
  210. return S;
  211. });
  212. Sk.builtin.set.prototype["copy"] = new Sk.builtin.func(function (self) {
  213. Sk.builtin.pyCheckArgs("copy", arguments, 1, 1);
  214. return new Sk.builtin.set(self);
  215. });
  216. Sk.builtin.set.prototype["update"] = new Sk.builtin.func(function (self, other) {
  217. var i, it, item, arg;
  218. Sk.builtin.pyCheckArgs("update", arguments, 2);
  219. for (i = 1; i < arguments.length; i++) {
  220. arg = arguments[i];
  221. if (!Sk.builtin.checkIterable(arg)) {
  222. throw new Sk.builtin.TypeError("'" + Sk.abstr.typeName(arg) + "' object is not iterable");
  223. }
  224. for (it = Sk.abstr.iter(arg), item = it.tp$iternext();
  225. item !== undefined;
  226. item = it.tp$iternext()) {
  227. Sk.builtin.set.prototype["add"].func_code(self, item);
  228. }
  229. }
  230. return Sk.builtin.none.none$;
  231. });
  232. Sk.builtin.set.prototype["intersection_update"] = new Sk.builtin.func(function (self, other) {
  233. var i, it, item;
  234. Sk.builtin.pyCheckArgs("intersection_update", arguments, 2);
  235. for (i = 1; i < arguments.length; i++) {
  236. if (!Sk.builtin.checkIterable(arguments[i])) {
  237. throw new Sk.builtin.TypeError("'" + Sk.abstr.typeName(arguments[i]) +
  238. "' object is not iterable");
  239. }
  240. }
  241. for (it = Sk.abstr.iter(self), item = it.tp$iternext(); item !== undefined; item = it.tp$iternext()) {
  242. for (i = 1; i < arguments.length; i++) {
  243. if (!Sk.abstr.sequenceContains(arguments[i], item)) {
  244. Sk.builtin.set.prototype["discard"].func_code(self, item);
  245. break;
  246. }
  247. }
  248. }
  249. return Sk.builtin.none.none$;
  250. });
  251. Sk.builtin.set.prototype["difference_update"] = new Sk.builtin.func(function (self, other) {
  252. var i, it, item;
  253. Sk.builtin.pyCheckArgs("difference_update", arguments, 2);
  254. for (i = 1; i < arguments.length; i++) {
  255. if (!Sk.builtin.checkIterable(arguments[i])) {
  256. throw new Sk.builtin.TypeError("'" + Sk.abstr.typeName(arguments[i]) +
  257. "' object is not iterable");
  258. }
  259. }
  260. for (it = Sk.abstr.iter(self), item = it.tp$iternext(); item !== undefined; item = it.tp$iternext()) {
  261. for (i = 1; i < arguments.length; i++) {
  262. if (Sk.abstr.sequenceContains(arguments[i], item)) {
  263. Sk.builtin.set.prototype["discard"].func_code(self, item);
  264. break;
  265. }
  266. }
  267. }
  268. return Sk.builtin.none.none$;
  269. });
  270. Sk.builtin.set.prototype["symmetric_difference_update"] = new Sk.builtin.func(function (self, other) {
  271. Sk.builtin.pyCheckArgs("symmetric_difference_update", arguments, 2, 2);
  272. var sd = Sk.builtin.set.prototype["symmetric_difference"].func_code(self, other);
  273. self.set_reset_();
  274. Sk.builtin.set.prototype["update"].func_code(self, sd);
  275. return Sk.builtin.none.none$;
  276. });
  277. Sk.builtin.set.prototype["add"] = new Sk.builtin.func(function (self, item) {
  278. Sk.builtin.pyCheckArgs("add", arguments, 2, 2);
  279. self.v.mp$ass_subscript(item, true);
  280. return Sk.builtin.none.none$;
  281. });
  282. Sk.builtin.set.prototype["discard"] = new Sk.builtin.func(function (self, item) {
  283. Sk.builtin.pyCheckArgs("discard", arguments, 2, 2);
  284. Sk.builtin.dict.prototype["pop"].func_code(self.v, item,
  285. Sk.builtin.none.none$);
  286. return Sk.builtin.none.none$;
  287. });
  288. Sk.builtin.set.prototype["pop"] = new Sk.builtin.func(function (self) {
  289. var it, item;
  290. Sk.builtin.pyCheckArgs("pop", arguments, 1, 1);
  291. if (self.sq$length() === 0) {
  292. throw new Sk.builtin.KeyError("pop from an empty set");
  293. }
  294. it = Sk.abstr.iter(self);
  295. item = it.tp$iternext();
  296. Sk.builtin.set.prototype["discard"].func_code(self, item);
  297. return item;
  298. });
  299. Sk.builtin.set.prototype["remove"] = new Sk.builtin.func(function (self, item) {
  300. Sk.builtin.pyCheckArgs("remove", arguments, 2, 2);
  301. self.v.mp$del_subscript(item);
  302. return Sk.builtin.none.none$;
  303. });
  304. goog.exportSymbol("Sk.builtin.set", Sk.builtin.set);
  305. /**
  306. * @constructor
  307. * @param {Object} obj
  308. */
  309. Sk.builtin.set_iter_ = function (obj) {
  310. var allkeys, k, i, bucket, buckets;
  311. if (!(this instanceof Sk.builtin.set_iter_)) {
  312. return new Sk.builtin.set_iter_(obj);
  313. }
  314. this.$obj = obj;
  315. this.tp$iter = this;
  316. allkeys = [];
  317. buckets = obj.v.buckets;
  318. for (k in buckets) {
  319. if (buckets.hasOwnProperty(k)) {
  320. bucket = buckets[k];
  321. if (bucket && bucket.$hash !== undefined && bucket.items !== undefined) {
  322. // skip internal stuff. todo; merge pyobj and this
  323. for (i = 0; i < bucket.items.length; i++) {
  324. allkeys.push(bucket.items[i].lhs);
  325. }
  326. }
  327. }
  328. }
  329. this.$index = 0;
  330. this.$keys = allkeys;
  331. this.tp$iternext = function () {
  332. if (this.$index >= this.$keys.length) {
  333. return undefined;
  334. }
  335. return this.$keys[this.$index++];
  336. };
  337. this.$r = function () {
  338. return new Sk.builtin.str("setiterator");
  339. };
  340. return this;
  341. };
  342. Sk.abstr.setUpInheritance("setiterator", Sk.builtin.set_iter_, Sk.builtin.object);
  343. Sk.builtin.set_iter_.prototype.__class__ = Sk.builtin.set_iter_;
  344. Sk.builtin.set_iter_.prototype.__iter__ = new Sk.builtin.func(function (self) {
  345. Sk.builtin.pyCheckArgs("__iter__", arguments, 0, 0, true, false);
  346. return self;
  347. });
  348. Sk.builtin.set_iter_.prototype["next"] = new Sk.builtin.func(function (self) {
  349. var ret = self.tp$iternext();
  350. if (ret === undefined) {
  351. throw new Sk.builtin.StopIteration();
  352. }
  353. return ret;
  354. });