1 | 'use strict';
|
2 | var uncurryThis = require('../internals/function-uncurry-this');
|
3 | var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');
|
4 | var toString = require('../internals/to-string');
|
5 | var requireObjectCoercible = require('../internals/require-object-coercible');
|
6 |
|
7 | var charAt = uncurryThis(''.charAt);
|
8 | var charCodeAt = uncurryThis(''.charCodeAt);
|
9 | var stringSlice = uncurryThis(''.slice);
|
10 |
|
11 | var createMethod = function (CONVERT_TO_STRING) {
|
12 | return function ($this, pos) {
|
13 | var S = toString(requireObjectCoercible($this));
|
14 | var position = toIntegerOrInfinity(pos);
|
15 | var size = S.length;
|
16 | var first, second;
|
17 | if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;
|
18 | first = charCodeAt(S, position);
|
19 | return first < 0xD800 || first > 0xDBFF || position + 1 === size
|
20 | || (second = charCodeAt(S, position + 1)) < 0xDC00 || second > 0xDFFF
|
21 | ? CONVERT_TO_STRING
|
22 | ? charAt(S, position)
|
23 | : first
|
24 | : CONVERT_TO_STRING
|
25 | ? stringSlice(S, position, position + 2)
|
26 | : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;
|
27 | };
|
28 | };
|
29 |
|
30 | module.exports = {
|
31 |
|
32 |
|
33 | codeAt: createMethod(false),
|
34 |
|
35 |
|
36 | charAt: createMethod(true)
|
37 | };
|