pull/1274/head
Rich-Harris 8 years ago
parent 105ab41d63
commit 99afa99565

@ -1,33 +1,23 @@
import { assign } from './utils.js'; export function destroyBlock(block, lookup) {
block.u();
export function destroyIteration(iteration, lookup) { block.d();
var first = iteration.first; lookup[block.key] = null;
if (first && first.parentNode) {
iteration.u();
}
iteration.d();
lookup[iteration.key] = null;
} }
export function outroAndDestroyIteration(iteration, lookup) { export function outroAndDestroyBlock(block, lookup) {
iteration.o(function() { block.o(function() {
iteration.u(); destroyBlock(block, lookup);
iteration.d();
lookup[iteration.key] = null;
}); });
} }
export function updateKeyedEach(old_blocks, component, changed, key_prop, dynamic, list, lookup, node, has_outro, create_each_block, intro_method, get_context) { export function updateKeyedEach(old_blocks, component, changed, key_prop, dynamic, list, lookup, node, has_outro, create_each_block, intro_method, get_context) {
var old_indexes = {};
var i = 0;
var old_keys = old_blocks.map(function(block) {
return block.key;
});
var o = old_blocks.length; var o = old_blocks.length;
var n = list.length; var n = list.length;
var i = o;
var old_indexes = {};
while (i--) old_indexes[old_blocks[i].key] = i;
var new_blocks = []; var new_blocks = [];
var new_lookup = {}; var new_lookup = {};
var deltas = {}; var deltas = {};
@ -36,6 +26,7 @@ export function updateKeyedEach(old_blocks, component, changed, key_prop, dynami
while (i--) { while (i--) {
var key = list[i][key_prop]; var key = list[i][key_prop];
var block = lookup[key]; var block = lookup[key];
if (!block) { if (!block) {
block = create_each_block(component, key, get_context(i)); block = create_each_block(component, key, get_context(i));
block.c(); block.c();
@ -53,7 +44,13 @@ export function updateKeyedEach(old_blocks, component, changed, key_prop, dynami
var will_move = {}; var will_move = {};
var did_move = {}; var did_move = {};
var destroy = has_outro ? outroAndDestroyIteration : destroyIteration; var destroy = has_outro ? outroAndDestroyBlock : destroyBlock;
function insert(block) {
block[intro_method](node, next && next.first);
next = lookup[block.key] = block;
n--;
}
while (o && n) { while (o && n) {
var new_block = new_blocks[n - 1]; var new_block = new_blocks[n - 1];
@ -62,61 +59,41 @@ export function updateKeyedEach(old_blocks, component, changed, key_prop, dynami
var old_key = old_block.key; var old_key = old_block.key;
if (new_block === old_block) { if (new_block === old_block) {
// do nothing
next = new_block;
o--; o--;
n--; n--;
next = new_block;
} }
else if (!new_lookup[old_key]) { else if (!new_lookup[old_key]) {
// removing // remove old block
destroy(old_block, lookup); destroy(old_block, lookup);
o--; o--;
} }
else if (!lookup[new_key]) { else if (!lookup[new_key] || will_move[new_key]) {
// creating insert(new_block);
new_block[intro_method](node, next && next.first);
next = lookup[new_key] = new_block;
n--;
} }
else { else if (did_move[old_key]) {
// moving
if (did_move[old_key]) {
o--; o--;
} else if (will_move[new_key]) {
new_block[intro_method](node, next && next.first);
next = new_block;
n--;
} else if (deltas[new_key] > deltas[old_key]) { } else if (deltas[new_key] > deltas[old_key]) {
// we already have both blocks, but they're out of order
new_block[intro_method](node, next && next.first);
next = new_block;
did_move[new_key] = true; did_move[new_key] = true;
n--; insert(new_block);
} else { } else {
will_move[old_key] = true; will_move[old_key] = true;
o--; o--;
} }
} }
}
while (o--) { while (o--) {
var old_block = old_blocks[o]; var old_block = old_blocks[o];
if (!new_lookup[old_block.key]) destroy(old_block, lookup); if (!new_lookup[old_block.key]) destroy(old_block, lookup);
} }
while (n--) { while (n) insert(new_blocks[n - 1]);
var key = list[n][key_prop];
new_lookup[key][intro_method](node, next && next.first);
next = lookup[key] = new_lookup[key];
}
return list.map(function(item) { return new_blocks;
return new_lookup[item[key_prop]];
});
} }
Loading…
Cancel
Save