| 'use strict'; |
| var charAt = require('../internals/string-multibyte').charAt; |
| var InternalStateModule = require('../internals/internal-state'); |
| var defineIterator = require('../internals/define-iterator'); |
| |
| var STRING_ITERATOR = 'String Iterator'; |
| var setInternalState = InternalStateModule.set; |
| var getInternalState = InternalStateModule.getterFor(STRING_ITERATOR); |
| |
| // `String.prototype[@@iterator]` method |
| // https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator |
| defineIterator(String, 'String', function (iterated) { |
| setInternalState(this, { |
| type: STRING_ITERATOR, |
| string: String(iterated), |
| index: 0 |
| }); |
| // `%StringIteratorPrototype%.next` method |
| // https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next |
| }, function next() { |
| var state = getInternalState(this); |
| var string = state.string; |
| var index = state.index; |
| var point; |
| if (index >= string.length) return { value: undefined, done: true }; |
| point = charAt(string, index); |
| state.index += point.length; |
| return { value: point, done: false }; |
| }); |