36 lines
1.0 KiB
JavaScript
36 lines
1.0 KiB
JavaScript
|
|
import * as ID from '../utils/ID.js'
|
|
|
|
/**
|
|
* @private
|
|
* Delete all items in an ID-range.
|
|
* Does not create delete operations!
|
|
* TODO: implement getItemCleanStartNode for better performance (only one lookup).
|
|
*/
|
|
export const deleteItemRange = (y, user, clock, range, gcChildren) => {
|
|
let item = y.os.getItemCleanStart(ID.createID(user, clock))
|
|
if (item !== null) {
|
|
if (!item._deleted) {
|
|
item._splitAt(y, range)
|
|
item._delete(y, false, true)
|
|
}
|
|
let itemLen = item._length
|
|
range -= itemLen
|
|
clock += itemLen
|
|
if (range > 0) {
|
|
let node = y.os.findNode(ID.createID(user, clock))
|
|
while (node !== null && node.val !== null && range > 0 && node.val._id.equals(ID.createID(user, clock))) {
|
|
const nodeVal = node.val
|
|
if (!nodeVal._deleted) {
|
|
nodeVal._splitAt(y, range)
|
|
nodeVal._delete(y, false, gcChildren)
|
|
}
|
|
const nodeLen = nodeVal._length
|
|
range -= nodeLen
|
|
clock += nodeLen
|
|
node = node.next()
|
|
}
|
|
}
|
|
}
|
|
}
|