enumerate.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /**
  2. * @constructor
  3. * @param {Object} iterable
  4. * @param {number=} start
  5. * @extends Sk.builtin.object
  6. */
  7. Sk.builtin.enumerate = function (iterable, start) {
  8. var it;
  9. if (!(this instanceof Sk.builtin.enumerate)) {
  10. return new Sk.builtin.enumerate(iterable, start);
  11. }
  12. Sk.builtin.pyCheckArgs("enumerate", arguments, 1, 2);
  13. if (!Sk.builtin.checkIterable(iterable)) {
  14. throw new Sk.builtin.TypeError("'" + Sk.abstr.typeName(iterable) + "' object is not iterable");
  15. }
  16. if (start !== undefined) {
  17. if (!Sk.misceval.isIndex(start)) {
  18. throw new Sk.builtin.TypeError("'" + Sk.abstr.typeName(start) + "' object cannot be interpreted as an index");
  19. } else {
  20. start = Sk.misceval.asIndex(start);
  21. }
  22. } else {
  23. start = 0;
  24. }
  25. it = iterable.tp$iter();
  26. this.tp$iter = function () {
  27. return this;
  28. };
  29. this.$index = start;
  30. this.tp$iternext = function () {
  31. // todo; StopIteration
  32. var idx;
  33. var next = it.tp$iternext();
  34. if (next === undefined) {
  35. return undefined;
  36. }
  37. idx = new Sk.builtin.int_(this.$index++);
  38. return new Sk.builtin.tuple([idx, next]);
  39. };
  40. this.__class__ = Sk.builtin.enumerate;
  41. return this;
  42. };
  43. Sk.abstr.setUpInheritance("enumerate", Sk.builtin.enumerate, Sk.builtin.object);
  44. Sk.builtin.enumerate.prototype["__iter__"] = new Sk.builtin.func(function (self) {
  45. return self.tp$iter();
  46. });
  47. Sk.builtin.enumerate.prototype["next"] = new Sk.builtin.func(function (self) {
  48. return self.tp$iternext();
  49. });
  50. Sk.builtin.enumerate.prototype["$r"] = function () {
  51. return new Sk.builtin.str("<enumerate object>");
  52. };