Browse Source

mol-state: throw error when trying to reuse StateBuilder

David Sehnal 5 years ago
parent
commit
d99b5bd505
2 changed files with 7 additions and 1 deletions
  1. 5 0
      src/mol-state/state.ts
  2. 2 1
      src/mol-state/state/builder.ts

+ 5 - 0
src/mol-state/state.ts

@@ -249,6 +249,11 @@ class State {
 
             if (!this.inTransaction) this.behaviors.isUpdating.next(true);
             try {
+                if (StateBuilder.is(tree)) {
+                    if (tree.editInfo.applied) throw new Error('This builder has already been applied. Create a new builder for further state updates');
+                    tree.editInfo.applied = true;
+                }
+
                 this.reverted = false;
                 const ret = options && (options.revertIfAborted || options.revertOnError)
                     ? await this._revertibleTreeUpdate(taskCtx, params, options)

+ 2 - 1
src/mol-state/state/builder.ts

@@ -21,6 +21,7 @@ interface StateBuilder {
 
 namespace StateBuilder {
     export interface EditInfo {
+        applied: boolean,
         sourceTree: StateTree,
         count: number,
         lastUpdate?: StateTransform.Ref
@@ -108,7 +109,7 @@ namespace StateBuilder {
             return this.state.state.runTask(this.state.state.updateTree(this, options));
         }
 
-        constructor(tree: StateTree, state?: State) { this.state = { state, tree: tree.asTransient(), actions: [], editInfo: { sourceTree: tree, count: 0, lastUpdate: void 0 } } }
+        constructor(tree: StateTree, state?: State) { this.state = { state, tree: tree.asTransient(), actions: [], editInfo: { applied: false, sourceTree: tree, count: 0, lastUpdate: void 0 } } }
     }
 
     export class To<A extends StateObject, T extends StateTransformer = StateTransformer> implements StateBuilder {