diff --git a/de.dlr.sc.virsat.model.extension.statemachines/src/de/dlr/sc/virsat/model/extension/statemachines/util/StateMachineHelper.java b/de.dlr.sc.virsat.model.extension.statemachines/src/de/dlr/sc/virsat/model/extension/statemachines/util/StateMachineHelper.java index 122d00cee..ece833566 100644 --- a/de.dlr.sc.virsat.model.extension.statemachines/src/de/dlr/sc/virsat/model/extension/statemachines/util/StateMachineHelper.java +++ b/de.dlr.sc.virsat.model.extension.statemachines/src/de/dlr/sc/virsat/model/extension/statemachines/util/StateMachineHelper.java @@ -11,9 +11,10 @@ import java.util.ArrayList; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; +import java.util.Stack; import de.dlr.sc.virsat.model.extension.statemachines.model.AConstraint; import de.dlr.sc.virsat.model.extension.statemachines.model.StateMachine; @@ -34,17 +35,27 @@ private StateMachineHelper() { } * An extended set of state machines that does not contain dangling constraints. */ public static Set transitiveClosureOverConstraints(Set stateMachines) { - var result = new HashSet(stateMachines); - - Set extension; - do { - extension = result.stream() - .flatMap(sm -> sm.getConstraints().stream().flatMap(c -> referencedStateMachines(c).stream())) - .filter(sm -> !result.contains(sm)) - .collect(Collectors.toSet()); + var stack = new Stack>(); + var result = new HashSet(); + + stack.push(stateMachines.iterator()); + + while (!stack.isEmpty()) { + var it = stack.peek(); - result.addAll(extension); - } while (!extension.isEmpty()); + if (!it.hasNext()) { + stack.pop(); + } else { + var sm = it.next(); + + if (result.contains(sm)) { + continue; + } else { + result.add(sm); + stack.push(sm.getConstraints().stream().flatMap(c -> referencedStateMachines(c).stream()).iterator()); + } + } + } return result; }