Urara-Blog/node_modules/.pnpm-store/v3/files/a6/72557b9a0f0ea32c35ab2fa36dd9901a5ed2174cf06f8b3c835c70119ff62732cdad862d8ed8628faa4a47fb2fdd34ba0cad5aa2e776e3105ea1f770e647de
2022-08-14 01:14:53 +08:00

69 lines
2 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Like `Array#splice`, but smarter for giant arrays.
*
* `Array#splice` takes all items to be inserted as individual argument which
* causes a stack overflow in V8 when trying to insert 100k items for instance.
*
* Otherwise, this does not return the removed items, and takes `items` as an
* array instead of rest parameters.
*
* @template {unknown} T
* @param {T[]} list
* @param {number} start
* @param {number} remove
* @param {T[]} items
* @returns {void}
*/
export function splice(list, start, remove, items) {
const end = list.length
let chunkStart = 0
/** @type {unknown[]} */
let parameters // Make start between zero and `end` (included).
if (start < 0) {
start = -start > end ? 0 : end + start
} else {
start = start > end ? end : start
}
remove = remove > 0 ? remove : 0 // No need to chunk the items if theres only a couple (10k) items.
if (items.length < 10000) {
parameters = Array.from(items)
parameters.unshift(start, remove) // @ts-expect-error Hush, its fine.
;[].splice.apply(list, parameters)
} else {
// Delete `remove` items starting from `start`
if (remove) [].splice.apply(list, [start, remove]) // Insert the items in chunks to not cause stack overflows.
while (chunkStart < items.length) {
parameters = items.slice(chunkStart, chunkStart + 10000)
parameters.unshift(start, 0) // @ts-expect-error Hush, its fine.
;[].splice.apply(list, parameters)
chunkStart += 10000
start += 10000
}
}
}
/**
* Append `items` (an array) at the end of `list` (another array).
* When `list` was empty, returns `items` instead.
*
* This prevents a potentially expensive operation when `list` is empty,
* and adds items in batches to prevent V8 from hanging.
*
* @template {unknown} T
* @param {T[]} list
* @param {T[]} items
* @returns {T[]}
*/
export function push(list, items) {
if (list.length > 0) {
splice(list, list.length, 0, items)
return list
}
return items
}