UNPKG

1.59 kBJavaScriptView Raw
1'use strict';
2var $ = require('../internals/export');
3var createIteratorConstructor = require('../internals/iterator-create-constructor');
4var createIterResultObject = require('../internals/create-iter-result-object');
5var requireObjectCoercible = require('../internals/require-object-coercible');
6var toString = require('../internals/to-string');
7var InternalStateModule = require('../internals/internal-state');
8var StringMultibyteModule = require('../internals/string-multibyte');
9
10var codeAt = StringMultibyteModule.codeAt;
11var charAt = StringMultibyteModule.charAt;
12var STRING_ITERATOR = 'String Iterator';
13var setInternalState = InternalStateModule.set;
14var getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);
15
16// TODO: unify with String#@@iterator
17var $StringIterator = createIteratorConstructor(function StringIterator(string) {
18 setInternalState(this, {
19 type: STRING_ITERATOR,
20 string: string,
21 index: 0
22 });
23}, 'String', function next() {
24 var state = getInternalState(this);
25 var string = state.string;
26 var index = state.index;
27 var point;
28 if (index >= string.length) return createIterResultObject(undefined, true);
29 point = charAt(string, index);
30 state.index += point.length;
31 return createIterResultObject({ codePoint: codeAt(point, 0), position: index }, false);
32});
33
34// `String.prototype.codePoints` method
35// https://github.com/tc39/proposal-string-prototype-codepoints
36$({ target: 'String', proto: true, forced: true }, {
37 codePoints: function codePoints() {
38 return new $StringIterator(toString(requireObjectCoercible(this)));
39 }
40});