el-beeswarm
Version:
<div style="display: flex; padding: 1rem; flex-direction: column; align-items: center; justify-content: center; height: 100vh; text-align: center; display: flex;
45 lines (37 loc) • 1.34 kB
JavaScript
export default chunkedSplice
import constants from '../constant/constants.mjs'
import splice from '../constant/splice.mjs'
// `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.
function chunkedSplice(list, start, remove, items) {
var end = list.length
var chunkStart = 0
var 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 there’s only a couple (10k) items.
if (items.length < constants.v8MaxSafeChunkSize) {
parameters = Array.from(items)
parameters.unshift(start, remove)
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 + constants.v8MaxSafeChunkSize
)
parameters.unshift(start, 0)
splice.apply(list, parameters)
chunkStart += constants.v8MaxSafeChunkSize
start += constants.v8MaxSafeChunkSize
}
}
}