| 'use strict'; |
| var $ = require('../internals/export'); |
| var createIteratorConstructor = require('../internals/create-iterator-constructor'); |
| var requireObjectCoercible = require('../internals/require-object-coercible'); |
| var InternalStateModule = require('../internals/internal-state'); |
| var StringMultibyteModule = require('../internals/string-multibyte'); |
| |
| var codeAt = StringMultibyteModule.codeAt; |
| var charAt = StringMultibyteModule.charAt; |
| var STRING_ITERATOR = 'String Iterator'; |
| var setInternalState = InternalStateModule.set; |
| var getInternalState = InternalStateModule.getterFor(STRING_ITERATOR); |
| |
| // TODO: unify with String#@@iterator |
| var $StringIterator = createIteratorConstructor(function StringIterator(string) { |
| setInternalState(this, { |
| type: STRING_ITERATOR, |
| string: string, |
| index: 0 |
| }); |
| }, 'String', 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: { codePoint: codeAt(point, 0), position: index }, done: false }; |
| }); |
| |
| // `String.prototype.codePoints` method |
| // https://github.com/tc39/proposal-string-prototype-codepoints |
| $({ target: 'String', proto: true }, { |
| codePoints: function codePoints() { |
| return new $StringIterator(String(requireObjectCoercible(this))); |
| } |
| }); |