| 'use strict'; | 
|   | 
| var hasSymbols = require('has-symbols')(); | 
| var GetIntrinsic = require('get-intrinsic'); | 
| var callBound = require('call-bind/callBound'); | 
| var isString = require('is-string'); | 
|   | 
| var $iterator = GetIntrinsic('%Symbol.iterator%', true); | 
| var $stringSlice = callBound('String.prototype.slice'); | 
| var $String = GetIntrinsic('%String%', true); | 
|   | 
| module.exports = function getIteratorMethod(ES, iterable) { | 
|     var usingIterator; | 
|     if (hasSymbols) { | 
|         usingIterator = ES.GetMethod(iterable, $iterator); | 
|     } else if (ES.IsArray(iterable)) { | 
|         usingIterator = function () { | 
|             var i = -1; | 
|             var arr = this; // eslint-disable-line no-invalid-this | 
|             return { | 
|                 next: function () { | 
|                     i += 1; | 
|                     return { | 
|                         done: i >= arr.length, | 
|                         value: arr[i] | 
|                     }; | 
|                 } | 
|             }; | 
|         }; | 
|     } else if (isString(iterable)) { | 
|         usingIterator = function () { | 
|             var i = 0; | 
|             return { | 
|                 next: function () { | 
|                     var nextIndex = ES.AdvanceStringIndex($String(iterable), i, true); | 
|                     var value = $stringSlice(iterable, i, nextIndex); | 
|                     i = nextIndex; | 
|                     return { | 
|                         done: nextIndex > iterable.length, | 
|                         value: value | 
|                     }; | 
|                 } | 
|             }; | 
|         }; | 
|     } | 
|     return usingIterator; | 
| }; |