/** | |
* 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 | |
* Item type. | |
* @param {Array<T>} list | |
* List to operate on. | |
* @param {number} start | |
* Index to remove/insert at (can be negative). | |
* @param {number} remove | |
* Number of items to remove. | |
* @param {Array<T>} items | |
* Items to inject into `list`. | |
* @returns {void} | |
* Nothing. | |
*/ | |
export function splice<T extends unknown>( | |
list: T[], | |
start: number, | |
remove: number, | |
items: T[] | |
): void | |
/** | |
* 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 | |
* Item type. | |
* @param {Array<T>} list | |
* List to operate on. | |
* @param {Array<T>} items | |
* Items to add to `list`. | |
* @returns {Array<T>} | |
* Either `list` or `items`. | |
*/ | |
export function push<T extends unknown>(list: T[], items: T[]): T[] | |