foop
Version:
interfaces that describe their intentions.
54 lines (48 loc) • 3.87 kB
JavaScript
var preAllocate = require('./preAllocate')
/**
* @name spliceIn
* @since 5.0.0 beta.6
* @memberOf array
*
* @param {Array} array array to splice
* @param {number} idx index to splice at
* @param {*} val value to replace at index
* @param {boolean} [canEdit=false] should mutate
* @return {Array}
*
* {@link https://github.com/facebook/immutable-js/blob/master/src/Map.js#L930 immutable-js-splice-in}
* @see {@link immutable-js-splice-in}
* @see array/insertAtIndex
*
* @example
*
* spliceIn(['zero', 'one'], 1, 'wan')
* //=> ['zero', 'wan']
*
* spliceIn(['zero', 'one'], 0, 'wan')
* //=> ['wan', 'one']
*
* spliceIn(['zero', 'one'], 0, 'wan', true)
* //=> ['wan', 'one']
*
*/
module.exports = function spliceIn(array, idx, val, canEdit) {
var newLen = array.length + 1
if (canEdit && idx + 1 === newLen) {
array[idx] = val
return array
}
var newArray = preAllocate(newLen)
var after = 0
for (var ii = 0; ii < newLen; ii++) {
if (ii === idx) {
newArray[ii] = val
after = -1
}
else {
newArray[ii] = array[ii + after]
}
}
return newArray
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaWNlSW4uanMiLCJzb3VyY2VzIjpbInNwbGljZUluLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IHByZUFsbG9jYXRlID0gcmVxdWlyZSgnLi9wcmVBbGxvY2F0ZScpXG5cbi8qKlxuICogQG5hbWUgc3BsaWNlSW5cbiAqIEBzaW5jZSA1LjAuMCBiZXRhLjZcbiAqIEBtZW1iZXJPZiBhcnJheVxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IGFycmF5IHRvIHNwbGljZVxuICogQHBhcmFtIHtudW1iZXJ9IGlkeCBpbmRleCB0byBzcGxpY2UgYXRcbiAqIEBwYXJhbSB7Kn0gdmFsIHZhbHVlIHRvIHJlcGxhY2UgYXQgaW5kZXhcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NhbkVkaXQ9ZmFsc2VdIHNob3VsZCBtdXRhdGVcbiAqIEByZXR1cm4ge0FycmF5fVxuICpcbiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svaW1tdXRhYmxlLWpzL2Jsb2IvbWFzdGVyL3NyYy9NYXAuanMjTDkzMCBpbW11dGFibGUtanMtc3BsaWNlLWlufVxuICogQHNlZSB7QGxpbmsgaW1tdXRhYmxlLWpzLXNwbGljZS1pbn1cbiAqIEBzZWUgYXJyYXkvaW5zZXJ0QXRJbmRleFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogICAgc3BsaWNlSW4oWyd6ZXJvJywgJ29uZSddLCAxLCAnd2FuJylcbiAqICAgIC8vPT4gWyd6ZXJvJywgJ3dhbiddXG4gKlxuICogICAgc3BsaWNlSW4oWyd6ZXJvJywgJ29uZSddLCAwLCAnd2FuJylcbiAqICAgIC8vPT4gWyd3YW4nLCAnb25lJ11cbiAqXG4gKiAgICBzcGxpY2VJbihbJ3plcm8nLCAnb25lJ10sIDAsICd3YW4nLCB0cnVlKVxuICogICAgLy89PiBbJ3dhbicsICdvbmUnXVxuICpcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzcGxpY2VJbihhcnJheSwgaWR4LCB2YWwsIGNhbkVkaXQpIHtcbiAgY29uc3QgbmV3TGVuID0gYXJyYXkubGVuZ3RoICsgMVxuXG4gIGlmIChjYW5FZGl0ICYmIGlkeCArIDEgPT09IG5ld0xlbikge1xuICAgIGFycmF5W2lkeF0gPSB2YWxcbiAgICByZXR1cm4gYXJyYXlcbiAgfVxuXG4gIGNvbnN0IG5ld0FycmF5ID0gcHJlQWxsb2NhdGUobmV3TGVuKVxuICBsZXQgYWZ0ZXIgPSAwXG5cbiAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IG5ld0xlbjsgaWkrKykge1xuICAgIGlmIChpaSA9PT0gaWR4KSB7XG4gICAgICBuZXdBcnJheVtpaV0gPSB2YWxcbiAgICAgIGFmdGVyID0gLTFcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBuZXdBcnJheVtpaV0gPSBhcnJheVtpaSArIGFmdGVyXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdBcnJheVxufVxuIl0sIm5hbWVzIjpbImNvbnN0IiwibGV0Il0sIm1hcHBpbmdzIjoiQUFBQUEsR0FBSyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTZCNUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxTQUFTLFFBQVEsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUU7RUFDM0RBLEdBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDOztFQUUvQixJQUFJLE9BQU8sSUFBSSxHQUFHLEdBQUcsQ0FBQyxLQUFLLE1BQU0sRUFBRTtJQUNqQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRztJQUNoQixPQUFPLEtBQUs7R0FDYjs7RUFFREEsR0FBSyxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO0VBQ3BDQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUM7O0VBRWIsS0FBS0EsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUNsQyxJQUFJLEVBQUUsS0FBSyxHQUFHLEVBQUU7TUFDZCxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRztNQUNsQixLQUFLLEdBQUcsQ0FBQyxDQUFDO0tBQ1g7U0FDSTtNQUNILFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQztLQUNqQztHQUNGOztFQUVELE9BQU8sUUFBUTtDQUNoQjsifQ==