foop
Version:
interfaces that describe their intentions.
44 lines (40 loc) • 3.77 kB
JavaScript
var size = require('../util/size')
var isValidArrayIndex = require('../is/validArrayIndex')
var isStringPrimitive = require('../is/stringPrimitive')
var toInt32 = require('../cast/toInt32')
var toLength = require('../cast/toLength')
/**
* @name toIndex
* @alias castToIndex
*
* @since 5.0.0-beta.6
* @memberOf cast
*
* @param {number} index index to cast
* @param {number | Array} [list=1] number or array
* @return {number} valid index
*
* {@link https://github.com/facebook/immutable-js/blob/master/src/TrieUtils.js#L58 immutable-js-toindex}
* {@link https://tc39.github.io/ecma262/#sec-toindex emca-toindex}
* @see {@link emca-toindex}
* @see {@link immutable-js-toindex}
*
* @see cast/toLength
* @see cast/toInt32
* @see cast/toSize
* @see is/validArrayIndex
* @see is/stringPrimitive
*/
module.exports = function toIndex(index, list) {
if (isValidArrayIndex(index) && isStringPrimitive(index)) {
index = toInt32(index)
}
index = toLength(index)
// below 0, add index (keep above 0)
// else, index
return index < 0
// @NOTE ensure above 0 if index is way below 0
? (size(list || 1) + index) || 1
: index
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9JbmRleC5qcyIsInNvdXJjZXMiOlsidG9JbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBzaXplID0gcmVxdWlyZSgnLi4vdXRpbC9zaXplJylcbmNvbnN0IGlzVmFsaWRBcnJheUluZGV4ID0gcmVxdWlyZSgnLi4vaXMvdmFsaWRBcnJheUluZGV4JylcbmNvbnN0IGlzU3RyaW5nUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaXMvc3RyaW5nUHJpbWl0aXZlJylcbmNvbnN0IHRvSW50MzIgPSByZXF1aXJlKCcuLi9jYXN0L3RvSW50MzInKVxuY29uc3QgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9jYXN0L3RvTGVuZ3RoJylcblxuLyoqXG4gKiBAbmFtZSB0b0luZGV4XG4gKiBAYWxpYXMgY2FzdFRvSW5kZXhcbiAqXG4gKiBAc2luY2UgNS4wLjAtYmV0YS42XG4gKiBAbWVtYmVyT2YgY2FzdFxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBpbmRleCB0byBjYXN0XG4gKiBAcGFyYW0ge251bWJlciB8IEFycmF5fSBbbGlzdD0xXSBudW1iZXIgb3IgYXJyYXlcbiAqIEByZXR1cm4ge251bWJlcn0gdmFsaWQgaW5kZXhcbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2ltbXV0YWJsZS1qcy9ibG9iL21hc3Rlci9zcmMvVHJpZVV0aWxzLmpzI0w1OCBpbW11dGFibGUtanMtdG9pbmRleH1cbiAqIHtAbGluayBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b2luZGV4IGVtY2EtdG9pbmRleH1cbiAqIEBzZWUge0BsaW5rIGVtY2EtdG9pbmRleH1cbiAqIEBzZWUge0BsaW5rIGltbXV0YWJsZS1qcy10b2luZGV4fVxuICpcbiAqIEBzZWUgY2FzdC90b0xlbmd0aFxuICogQHNlZSBjYXN0L3RvSW50MzJcbiAqIEBzZWUgY2FzdC90b1NpemVcbiAqIEBzZWUgaXMvdmFsaWRBcnJheUluZGV4XG4gKiBAc2VlIGlzL3N0cmluZ1ByaW1pdGl2ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRvSW5kZXgoaW5kZXgsIGxpc3QpIHtcbiAgaWYgKGlzVmFsaWRBcnJheUluZGV4KGluZGV4KSAmJiBpc1N0cmluZ1ByaW1pdGl2ZShpbmRleCkpIHtcbiAgICBpbmRleCA9IHRvSW50MzIoaW5kZXgpXG4gIH1cblxuICBpbmRleCA9IHRvTGVuZ3RoKGluZGV4KVxuXG4gIC8vIGJlbG93IDAsIGFkZCBpbmRleCAoa2VlcCBhYm92ZSAwKVxuICAvLyBlbHNlLCBpbmRleFxuICByZXR1cm4gaW5kZXggPCAwXG4gICAgLy8gQE5PVEUgZW5zdXJlIGFib3ZlIDAgaWYgaW5kZXggaXMgd2F5IGJlbG93IDBcbiAgICA/IChzaXplKGxpc3QgfHwgMSkgKyBpbmRleCkgfHwgMVxuICAgIDogaW5kZXhcbn1cbiJdLCJuYW1lcyI6WyJjb25zdCJdLCJtYXBwaW5ncyI6IkFBQUFBLEdBQUssQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztBQUNwQ0EsR0FBSyxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQztBQUMxREEsR0FBSyxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQztBQUMxREEsR0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUM7QUFDMUNBLEdBQUssQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3QjVDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsU0FBUyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRTtFQUM3QyxJQUFJLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxJQUFJLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxFQUFFO0lBQ3hELEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0dBQ3ZCOztFQUVELEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDOzs7O0VBSXZCLE9BQU8sS0FBSyxHQUFHLENBQUM7O01BRVosQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7TUFDOUIsS0FBSztDQUNWOyJ9