From 113ce789c69484120fca1592c9dcea1ba5ee4689 Mon Sep 17 00:00:00 2001
From: David Sehnal <david.sehnal@gmail.com>
Date: Fri, 9 Nov 2018 01:31:57 +0100
Subject: [PATCH] mol-state: delete nodes starting from leaves

---
 src/mol-state/state.ts | 16 +++++++---------
 1 file changed, 7 insertions(+), 9 deletions(-)

diff --git a/src/mol-state/state.ts b/src/mol-state/state.ts
index 0176e2fef..1d2b4cebe 100644
--- a/src/mol-state/state.ts
+++ b/src/mol-state/state.ts
@@ -165,16 +165,14 @@ namespace State {
         return findState.roots;
     }
 
+    type FindDeletesCtx = { newTree: StateTree, cells: State.Cells, deletes: Ref[] }
+    function _visitCheckDelete(n: ImmutableTree.Node<any>, _: any, ctx: FindDeletesCtx) {
+        if (!ctx.newTree.nodes.has(n.ref) && ctx.cells.has(n.ref)) ctx.deletes.push(n.ref);
+    }
     function findDeletes(ctx: UpdateContext): Ref[] {
-        // TODO: do this in some sort of "tree order"?
-        const deletes: Ref[] = [];
-        const keys = ctx.cells.keys();
-        while (true) {
-            const key = keys.next();
-            if (key.done) break;
-            if (!ctx.tree.nodes.has(key.value)) deletes.push(key.value);
-        }
-        return deletes;
+        const deleteCtx: FindDeletesCtx = { newTree: ctx.tree, cells: ctx.cells, deletes: [] };
+        ImmutableTree.doPostOrder(ctx.oldTree, ctx.oldTree.nodes.get(ctx.oldTree.rootRef), deleteCtx, _visitCheckDelete);
+        return deleteCtx.deletes;
     }
 
     function setObjectState(ctx: UpdateContext, ref: Ref, status: StateObjectCell.Status, errorText?: string) {
-- 
GitLab