(node, ownerID, level, index, value, didAlter)
| 505 | } |
| 506 | |
| 507 | function updateVNode(node, ownerID, level, index, value, didAlter) { |
| 508 | const idx = (index >>> level) & MASK; |
| 509 | const nodeHas = node && idx < node.array.length; |
| 510 | if (!nodeHas && value === undefined) { |
| 511 | return node; |
| 512 | } |
| 513 | |
| 514 | let newNode; |
| 515 | |
| 516 | if (level > 0) { |
| 517 | const lowerNode = node && node.array[idx]; |
| 518 | const newLowerNode = updateVNode( |
| 519 | lowerNode, |
| 520 | ownerID, |
| 521 | level - SHIFT, |
| 522 | index, |
| 523 | value, |
| 524 | didAlter |
| 525 | ); |
| 526 | if (newLowerNode === lowerNode) { |
| 527 | return node; |
| 528 | } |
| 529 | newNode = editableVNode(node, ownerID); |
| 530 | newNode.array[idx] = newLowerNode; |
| 531 | return newNode; |
| 532 | } |
| 533 | |
| 534 | if (nodeHas && node.array[idx] === value) { |
| 535 | return node; |
| 536 | } |
| 537 | |
| 538 | if (didAlter) { |
| 539 | SetRef(didAlter); |
| 540 | } |
| 541 | |
| 542 | newNode = editableVNode(node, ownerID); |
| 543 | if (value === undefined && idx === newNode.array.length - 1) { |
| 544 | newNode.array.pop(); |
| 545 | } else { |
| 546 | newNode.array[idx] = value; |
| 547 | } |
| 548 | return newNode; |
| 549 | } |
| 550 | |
| 551 | function editableVNode(node, ownerID) { |
| 552 | if (ownerID && node && ownerID === node.ownerID) { |
no test coverage detected