From 24839b334a4a6d6a4c197eb66249488ea2cc5576 Mon Sep 17 00:00:00 2001
From: dgelessus <dgelessus@users.noreply.github.com>
Date: Thu, 2 Jul 2020 19:24:37 +0200
Subject: [PATCH] Merge implementations of :constants, :init and :exec

---
 notebooks/tests/animate.ipynb                 |  8 ++++----
 .../java/de/prob2/jupyter/ProBKernel.java     | 20 +++++++++++++++++++
 .../jupyter/commands/ConstantsCommand.java    | 14 +------------
 .../prob2/jupyter/commands/ExecCommand.java   | 16 +--------------
 .../jupyter/commands/InitialiseCommand.java   | 14 +------------
 5 files changed, 27 insertions(+), 45 deletions(-)

diff --git a/notebooks/tests/animate.ipynb b/notebooks/tests/animate.ipynb
index c6e1ae6..68fef0d 100644
--- a/notebooks/tests/animate.ipynb
+++ b/notebooks/tests/animate.ipynb
@@ -281,7 +281,7 @@
     {
      "data": {
       "text/plain": [
-       "Machine constants set up using operation 2: $setup_constants()"
+       "Executed operation: $setup_constants()"
       ]
      },
      "execution_count": 11,
@@ -391,7 +391,7 @@
     {
      "data": {
       "text/plain": [
-       "Machine initialised using operation 7: $initialise_machine()"
+       "Executed operation: $initialise_machine()"
       ]
      },
      "execution_count": 16,
@@ -906,7 +906,7 @@
     {
      "data": {
       "text/plain": [
-       "Machine constants set up using operation 0: $setup_constants()"
+       "Executed operation: $setup_constants()"
       ]
      },
      "execution_count": 38,
@@ -949,7 +949,7 @@
     {
      "data": {
       "text/plain": [
-       "Machine initialised using operation 3: $initialise_machine()"
+       "Executed operation: $initialise_machine()"
       ]
      },
      "execution_count": 40,
diff --git a/src/main/java/de/prob2/jupyter/ProBKernel.java b/src/main/java/de/prob2/jupyter/ProBKernel.java
index 8513b96..3d3f24a 100644
--- a/src/main/java/de/prob2/jupyter/ProBKernel.java
+++ b/src/main/java/de/prob2/jupyter/ProBKernel.java
@@ -28,11 +28,13 @@ import com.google.inject.Singleton;
 
 import de.prob.animator.ReusableAnimator;
 import de.prob.animator.domainobjects.ErrorItem;
+import de.prob.animator.domainobjects.FormulaExpand;
 import de.prob.exception.ProBError;
 import de.prob.scripting.ClassicalBFactory;
 import de.prob.statespace.AnimationSelector;
 import de.prob.statespace.StateSpace;
 import de.prob.statespace.Trace;
+import de.prob.statespace.Transition;
 import de.prob2.jupyter.commands.AssertCommand;
 import de.prob2.jupyter.commands.BrowseCommand;
 import de.prob2.jupyter.commands.BsymbCommand;
@@ -302,6 +304,24 @@ public final class ProBKernel extends BaseKernel {
 		this.setCurrentMachineDirectory(machineDirectory);
 	}
 	
+	public @NotNull DisplayData executeOperation(final @NotNull String name, final @Nullable String predicate) {
+		final Trace trace = this.animationSelector.getCurrentTrace();
+		final String translatedOpName = Transition.unprettifyName(name);
+		final String modifiedPredicate;
+		if (predicate == null) {
+			modifiedPredicate = "1=1";
+		} else {
+			modifiedPredicate = this.insertLetVariables(predicate);
+		}
+		final List<Transition> ops = trace.getStateSpace().transitionFromPredicate(trace.getCurrentState(), translatedOpName, modifiedPredicate, 1);
+		assert !ops.isEmpty();
+		final Transition op = ops.get(0);
+		
+		this.animationSelector.changeCurrentAnimation(trace.add(op));
+		trace.getStateSpace().evaluateTransitions(Collections.singleton(op), FormulaExpand.TRUNCATE);
+		return new DisplayData(String.format("Executed operation: %s", op.getRep()));
+	}
+	
 	@Override
 	public @NotNull String getBanner() {
 		return "ProB Interactive Expression and Predicate Evaluator (on Jupyter)\nType \":help\" for more information.";
diff --git a/src/main/java/de/prob2/jupyter/commands/ConstantsCommand.java b/src/main/java/de/prob2/jupyter/commands/ConstantsCommand.java
index 5bb95a3..0683383 100644
--- a/src/main/java/de/prob2/jupyter/commands/ConstantsCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/ConstantsCommand.java
@@ -64,19 +64,7 @@ public final class ConstantsCommand implements Command {
 	
 	@Override
 	public @NotNull DisplayData run(final @NotNull ParsedArguments args) {
-		final Trace trace = this.animationSelector.getCurrentTrace();
-		final String predicate;
-		if (!args.get(PREDICATE_PARAM).isPresent()) {
-			predicate = "1=1";
-		} else {
-			predicate = this.kernelProvider.get().insertLetVariables(args.get(PREDICATE_PARAM).get());
-		}
-		final List<Transition> ops = trace.getStateSpace().transitionFromPredicate(trace.getCurrentState(), "$setup_constants", predicate, 1);
-		assert !ops.isEmpty();
-		final Transition op = ops.get(0);
-		this.animationSelector.changeCurrentAnimation(trace.add(op));
-		trace.getStateSpace().evaluateTransitions(Collections.singleton(op), FormulaExpand.TRUNCATE);
-		return new DisplayData(String.format("Machine constants set up using operation %s: %s", op.getId(), op.getRep()));
+		return this.kernelProvider.get().executeOperation(Transition.SETUP_CONSTANTS_NAME, args.get(PREDICATE_PARAM).orElse(null));
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/ExecCommand.java b/src/main/java/de/prob2/jupyter/commands/ExecCommand.java
index 2d3d73c..38aa66a 100644
--- a/src/main/java/de/prob2/jupyter/commands/ExecCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/ExecCommand.java
@@ -70,21 +70,7 @@ public final class ExecCommand implements Command {
 	
 	@Override
 	public @NotNull DisplayData run(final @NotNull ParsedArguments args) {
-		final Trace trace = this.animationSelector.getCurrentTrace();
-		final String translatedOpName = Transition.unprettifyName(args.get(OPERATION_PARAM));
-		final String predicate;
-		if (!args.get(PREDICATE_PARAM).isPresent()) {
-			predicate = "1=1";
-		} else {
-			predicate = this.kernelProvider.get().insertLetVariables(args.get(PREDICATE_PARAM).get());
-		}
-		final List<Transition> ops = trace.getStateSpace().transitionFromPredicate(trace.getCurrentState(), translatedOpName, predicate, 1);
-		assert !ops.isEmpty();
-		final Transition op = ops.get(0);
-		
-		this.animationSelector.changeCurrentAnimation(trace.add(op));
-		trace.getStateSpace().evaluateTransitions(Collections.singleton(op), FormulaExpand.TRUNCATE);
-		return new DisplayData(String.format("Executed operation: %s", op.getRep()));
+		return this.kernelProvider.get().executeOperation(args.get(OPERATION_PARAM), args.get(PREDICATE_PARAM).orElse(null));
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/InitialiseCommand.java b/src/main/java/de/prob2/jupyter/commands/InitialiseCommand.java
index 27d6426..eb08d94 100644
--- a/src/main/java/de/prob2/jupyter/commands/InitialiseCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/InitialiseCommand.java
@@ -64,19 +64,7 @@ public final class InitialiseCommand implements Command {
 	
 	@Override
 	public @NotNull DisplayData run(final @NotNull ParsedArguments args) {
-		final Trace trace = this.animationSelector.getCurrentTrace();
-		final String predicate;
-		if (!args.get(PREDICATE_PARAM).isPresent()) {
-			predicate = "1=1";
-		} else {
-			predicate = this.kernelProvider.get().insertLetVariables(args.get(PREDICATE_PARAM).get());
-		}
-		final List<Transition> ops = trace.getStateSpace().transitionFromPredicate(trace.getCurrentState(), "$initialise_machine", predicate, 1);
-		assert !ops.isEmpty();
-		final Transition op = ops.get(0);
-		this.animationSelector.changeCurrentAnimation(trace.add(op));
-		trace.getStateSpace().evaluateTransitions(Collections.singleton(op), FormulaExpand.TRUNCATE);
-		return new DisplayData(String.format("Machine initialised using operation %s: %s", op.getId(), op.getRep()));
+		return this.kernelProvider.get().executeOperation(Transition.INITIALISE_MACHINE_NAME, args.get(PREDICATE_PARAM).orElse(null));
 	}
 	
 	@Override
-- 
GitLab