getIteratorMethod.js 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. 'use strict';
  2. var hasSymbols = require('has-symbols')();
  3. var GetIntrinsic = require('get-intrinsic');
  4. var callBound = require('call-bound');
  5. var isString = require('is-string');
  6. var $iterator = GetIntrinsic('%Symbol.iterator%', true);
  7. var $stringSlice = callBound('String.prototype.slice');
  8. var $String = GetIntrinsic('%String%');
  9. var IsArray = require('./IsArray');
  10. module.exports = function getIteratorMethod(ES, iterable) {
  11. var usingIterator;
  12. if (hasSymbols) {
  13. usingIterator = ES.GetMethod(iterable, $iterator);
  14. } else if (IsArray(iterable)) {
  15. usingIterator = function () {
  16. var i = -1;
  17. var arr = this; // eslint-disable-line no-invalid-this
  18. return {
  19. next: function () {
  20. i += 1;
  21. return {
  22. done: i >= arr.length,
  23. value: arr[i]
  24. };
  25. }
  26. };
  27. };
  28. } else if (isString(iterable)) {
  29. usingIterator = function () {
  30. var i = 0;
  31. return {
  32. next: function () {
  33. var nextIndex = ES.AdvanceStringIndex($String(iterable), i, true);
  34. var value = $stringSlice(iterable, i, nextIndex);
  35. i = nextIndex;
  36. var done = nextIndex > iterable.length;
  37. return {
  38. done: done,
  39. value: done ? void undefined : value
  40. };
  41. }
  42. };
  43. };
  44. }
  45. return usingIterator;
  46. };