simplify a bit

pull/1274/head
Rich-Harris 8 years ago
parent 0672e7bae9
commit 105ab41d63

@ -17,18 +17,19 @@ export function outroAndDestroyIteration(iteration, lookup) {
}); });
} }
export function updateKeyedEach(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 old_indexes = {};
var i = 0; var i = 0;
var old_keys = blocks.map(function(block) { var old_keys = old_blocks.map(function(block) {
return block.key; return block.key;
}); });
var o = old_keys.length; var o = old_blocks.length;
var n = list.length; var n = list.length;
var new_blocks = {}; var new_blocks = [];
var new_lookup = {};
var deltas = {}; var deltas = {};
var i = n; var i = n;
@ -42,7 +43,7 @@ export function updateKeyedEach(blocks, component, changed, key_prop, dynamic, l
block.p(changed, get_context(i)); block.p(changed, get_context(i));
} }
new_blocks[key] = block; new_blocks[i] = new_lookup[key] = block;
if (key in old_indexes) deltas[key] = Math.abs(i - old_indexes[key]); if (key in old_indexes) deltas[key] = Math.abs(i - old_indexes[key]);
} }
@ -55,44 +56,45 @@ export function updateKeyedEach(blocks, component, changed, key_prop, dynamic, l
var destroy = has_outro ? outroAndDestroyIteration : destroyIteration; var destroy = has_outro ? outroAndDestroyIteration : destroyIteration;
while (o && n) { while (o && n) {
var item = list[n - 1]; var new_block = new_blocks[n - 1];
var new_key = item[key_prop]; var old_block = old_blocks[o - 1];
var old_key = old_keys[o - 1]; var new_key = new_block.key;
var old_key = old_block.key;
if (new_key === old_key) { if (new_block === old_block) {
o--; o--;
n--; n--;
next = new_blocks[new_key]; next = new_block;
} }
else if (lookup[old_key] && !new_blocks[old_key]) { else if (!new_lookup[old_key]) {
// removing // removing
destroy(lookup[old_key], lookup); destroy(old_block, lookup);
o--; o--;
} }
else if (!lookup[new_key]) { else if (!lookup[new_key]) {
// creating // creating
new_blocks[new_key][intro_method](node, next && next.first); new_block[intro_method](node, next && next.first);
next = new_blocks[new_key]; next = lookup[new_key] = new_block;
lookup[new_key] = new_blocks[new_key];
n--; n--;
} }
else if (lookup[old_key] && lookup[new_key]) { else {
// moving
if (did_move[old_key]) { if (did_move[old_key]) {
o--; o--;
} else if (will_move[new_key]) { } else if (will_move[new_key]) {
new_blocks[new_key][intro_method](node, next && next.first); new_block[intro_method](node, next && next.first);
next = new_blocks[new_key]; next = new_block;
n--; 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 // we already have both blocks, but they're out of order
new_blocks[new_key][intro_method](node, next && next.first); new_block[intro_method](node, next && next.first);
next = new_blocks[new_key]; next = new_block;
did_move[new_key] = true; did_move[new_key] = true;
n--; n--;
@ -104,17 +106,17 @@ export function updateKeyedEach(blocks, component, changed, key_prop, dynamic, l
} }
while (o--) { while (o--) {
var old_key = old_keys[o]; var old_block = old_blocks[o];
if (!new_blocks[old_key]) destroy(lookup[old_key], lookup); if (!new_lookup[old_block.key]) destroy(old_block, lookup);
} }
while (n--) { while (n--) {
var key = list[n][key_prop]; var key = list[n][key_prop];
new_blocks[key][intro_method](node, next && next.first); new_lookup[key][intro_method](node, next && next.first);
next = lookup[key] = new_blocks[key]; next = lookup[key] = new_lookup[key];
} }
return list.map(function(item) { return list.map(function(item) {
return new_blocks[item[key_prop]]; return new_lookup[item[key_prop]];
}); });
} }
Loading…
Cancel
Save