"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.patchChildren = patchChildren; exports.h = h; function isUndef(v) { return v === null || v === undefined; } function isDef(v) { return v !== null && v !== undefined; } function sameVval(oldVval, vval) { return vval.tag === oldVval.tag && vval.key === oldVval.key; } function createVm(vval) { var Vm = vval.tag; vval.vm = new Vm({ data: vval.args }); } function updateVval(vval) { var keys = Object.keys(vval.args); for (var i = 0; i < keys.length; i++) { keys.forEach(function (k) { vval.vm[k] = vval.args[k]; }); } } function createKeyToOldIdx(children, beginIdx, endIdx) { var i, key; var map = {}; for (i = beginIdx; i <= endIdx; ++i) { key = children[i].key; if (isDef(key)) map[key] = i; } return map; } function updateChildren(oldCh, newCh) { var oldStartIdx = 0; var newStartIdx = 0; var oldEndIdx = oldCh.length - 1; var oldStartVval = oldCh[0]; var oldEndVval = oldCh[oldEndIdx]; var newEndIdx = newCh.length - 1; var newStartVval = newCh[0]; var newEndVval = newCh[newEndIdx]; var oldKeyToIdx, idxInOld, elmToMove; while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) { if (isUndef(oldStartVval)) { oldStartVval = oldCh[++oldStartIdx]; } else if (isUndef(oldEndVval)) { oldEndVval = oldCh[--oldEndIdx]; } else if (sameVval(oldStartVval, newStartVval)) { patchVval(oldStartVval, newStartVval); oldStartVval = oldCh[++oldStartIdx]; newStartVval = newCh[++newStartIdx]; } else if (sameVval(oldEndVval, newEndVval)) { patchVval(oldEndVval, newEndVval); oldEndVval = oldCh[--oldEndIdx]; newEndVval = newCh[--newEndIdx]; } else if (sameVval(oldStartVval, newEndVval)) { patchVval(oldStartVval, newEndVval); oldStartVval = oldCh[++oldStartIdx]; newEndVval = newCh[--newEndIdx]; } else if (sameVval(oldEndVval, newStartVval)) { patchVval(oldEndVval, newStartVval); oldEndVval = oldCh[--oldEndIdx]; newStartVval = newCh[++newStartIdx]; } else { if (isUndef(oldKeyToIdx)) oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx); idxInOld = isDef(newStartVval.key) ? oldKeyToIdx[newStartVval.key] : null; if (isUndef(idxInOld)) { createVm(newStartVval); newStartVval = newCh[++newStartIdx]; } else { elmToMove = oldCh[idxInOld]; if (sameVval(elmToMove, newStartVval)) { patchVval(elmToMove, newStartVval); oldCh[idxInOld] = undefined; newStartVval = newCh[++newStartIdx]; } else { createVm(newStartVval); newStartVval = newCh[++newStartIdx]; } } } } if (oldStartIdx > oldEndIdx) { addVvals(newCh, newStartIdx, newEndIdx); } else if (newStartIdx > newEndIdx) { removeVvals(oldCh, oldStartIdx, oldEndIdx); } } function addVvals(vvals, startIdx, endIdx) { for (; startIdx <= endIdx; ++startIdx) { createVm(vvals[startIdx]); } } function removeVvals(vvals, startIdx, endIdx) { for (; startIdx <= endIdx; ++startIdx) { var ch = vvals[startIdx]; if (isDef(ch)) { ch.vm.$destroy(); ch.vm = null; } } } function patchVval(oldVval, vval) { if (oldVval === vval) { return; } vval.vm = oldVval.vm; updateVval(vval); } function patchChildren(oldCh, ch) { if (isDef(oldCh) && isDef(ch)) { if (oldCh !== ch) updateChildren(oldCh, ch); } else if (isDef(ch)) { addVvals(ch, 0, ch.length - 1); } else if (isDef(oldCh)) { removeVvals(oldCh, 0, oldCh.length - 1); } } function h(tag, key, args) { return { tag: tag, key: key, args: args }; }