Files
rspade_system/vendor/spatie/ignition/node_modules/micromark-util-chunked/index.js
root f6fac6c4bc Fix bin/publish: copy docs.dist from project root
Fix bin/publish: use correct .env path for rspade_system
Fix bin/publish script: prevent grep exit code 1 from terminating script

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-21 02:08:33 +00:00

70 lines
2.0 KiB
JavaScript
Executable File
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
}