| // Based on: https://github.com/mathiasbynens/String.prototype.at |
| // Thanks @mathiasbynens ! |
| |
| 'use strict'; |
| |
| var toInteger = require('../../number/to-integer') |
| , validValue = require('../../object/valid-value'); |
| |
| module.exports = function (pos) { |
| var str = String(validValue(this)), size = str.length |
| , cuFirst, cuSecond, nextPos, len; |
| pos = toInteger(pos); |
| |
| // Account for out-of-bounds indices |
| // The odd lower bound is because the ToInteger operation is |
| // going to round `n` to `0` for `-1 < n <= 0`. |
| if (pos <= -1 || pos >= size) return ''; |
| |
| // Second half of `ToInteger` |
| pos = pos | 0; |
| // Get the first code unit and code unit value |
| cuFirst = str.charCodeAt(pos); |
| nextPos = pos + 1; |
| len = 1; |
| if ( // check if it’s the start of a surrogate pair |
| (cuFirst >= 0xD800) && (cuFirst <= 0xDBFF) && // high surrogate |
| (size > nextPos) // there is a next code unit |
| ) { |
| cuSecond = str.charCodeAt(nextPos); |
| if (cuSecond >= 0xDC00 && cuSecond <= 0xDFFF) len = 2; // low surrogate |
| } |
| return str.slice(pos, pos + len); |
| }; |