esnext.iterator.concat.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. 'use strict';
  2. var $ = require('../internals/export');
  3. var call = require('../internals/function-call');
  4. var aCallable = require('../internals/a-callable');
  5. var anObject = require('../internals/an-object');
  6. var getIteratorMethod = require('../internals/get-iterator-method');
  7. var createIteratorProxy = require('../internals/iterator-create-proxy');
  8. var createIterResultObject = require('../internals/create-iter-result-object');
  9. var $Array = Array;
  10. var IteratorProxy = createIteratorProxy(function () {
  11. while (true) {
  12. var iterator = this.iterator;
  13. if (!iterator) {
  14. var iterableIndex = this.nextIterableIndex++;
  15. var iterables = this.iterables;
  16. if (iterableIndex >= iterables.length) {
  17. this.done = true;
  18. return createIterResultObject(undefined, true);
  19. }
  20. var entry = iterables[iterableIndex];
  21. this.iterables[iterableIndex] = null;
  22. iterator = this.iterator = call(entry.method, entry.iterable);
  23. this.next = iterator.next;
  24. }
  25. var result = anObject(call(this.next, iterator));
  26. if (result.done) {
  27. this.iterator = null;
  28. this.next = null;
  29. continue;
  30. }
  31. return result;
  32. }
  33. }, false, true);
  34. // `Iterator.concat` method
  35. // https://github.com/tc39/proposal-iterator-sequencing
  36. $({ target: 'Iterator', stat: true, forced: true }, {
  37. concat: function concat() {
  38. var length = arguments.length;
  39. var iterables = $Array(length);
  40. for (var index = 0; index < length; index++) {
  41. var item = anObject(arguments[index]);
  42. iterables[index] = {
  43. iterable: item,
  44. method: aCallable(getIteratorMethod(item))
  45. };
  46. }
  47. return new IteratorProxy({
  48. iterables: iterables,
  49. nextIterableIndex: 0,
  50. iterator: null,
  51. next: null
  52. });
  53. }
  54. });