--- /dev/null
+'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)));
+ }
+});