| var toInteger = require('../internals/to-integer'); |
| var requireObjectCoercible = require('../internals/require-object-coercible'); |
| |
| // `String.prototype.{ codePointAt, at }` methods implementation |
| var createMethod = function (CONVERT_TO_STRING) { |
| return function ($this, pos) { |
| var S = String(requireObjectCoercible($this)); |
| var position = toInteger(pos); |
| var size = S.length; |
| var first, second; |
| if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined; |
| first = S.charCodeAt(position); |
| return first < 0xD800 || first > 0xDBFF || position + 1 === size |
| || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF |
| ? CONVERT_TO_STRING ? S.charAt(position) : first |
| : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000; |
| }; |
| }; |
| |
| module.exports = { |
| // `String.prototype.codePointAt` method |
| // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat |
| codeAt: createMethod(false), |
| // `String.prototype.at` method |
| // https://github.com/mathiasbynens/String.prototype.at |
| charAt: createMethod(true) |
| }; |