in graphLayout/jetbrains.mps.graphLayout.planarization/source_gen/jetbrains/mps/graphLayout/planarization/PNode.java [34:162]
public PQNode processAsPertinentRoot(List<PQNode> children, Node nextGraphNode) {
ListSequence.fromList(this.getChildren()).removeWhere(new IWhereFilter<PQNode>() {
public boolean accept(PQNode it) {
return it.getState() != PQNode.State.EMPTY;
}
});
children = ListSequence.fromList(children).removeWhere(new IWhereFilter<PQNode>() {
public boolean accept(PQNode it) {
return it.getState() == PQNode.State.EMPTY;
}
});
List<PQNode> partialChildren = ListSequence.fromList(children).where(new IWhereFilter<PQNode>() {
public boolean accept(PQNode it) {
return it.getState() == PQNode.State.PARTIAL;
}
}).toListSequence();
int numPartialChildren = ListSequence.fromList(partialChildren).count();
QNode newComponent = new QNode();
PNode nextNode = new PNode(nextGraphNode, null);
newComponent.addLastChild(nextNode);
EdgesOrder edgesOrder = newComponent.getEdgesOrder();
this.addLastChild(newComponent);
if (numPartialChildren > 2) {
throw new RuntimeException("can not make reduction: pertinent root has more than two partial children");
}
if (numPartialChildren == 0) {
for (PQNode child : ListSequence.fromList(children).where(new IWhereFilter<PQNode>() {
public boolean accept(PQNode it) {
return it.getState() == PQNode.State.FULL;
}
})) {
child.collectEdgesOrderInSubtree(edgesOrder);
}
}
if (numPartialChildren == 1) {
PQNode partialChild = ListSequence.fromList(partialChildren).first();
List<PQNode> firstEmptySegment = ListSequence.fromList(new ArrayList<PQNode>());
boolean endFirstSegment = false;
for (PQNode child : ListSequence.fromList(partialChild.getChildren())) {
if (child.getState() == PQNode.State.FULL) {
endFirstSegment = true;
} else {
if (endFirstSegment) {
newComponent.addLastChild(child);
} else {
ListSequence.fromList(firstEmptySegment).addElement(child);
}
}
}
for (PQNode child : ListSequence.fromList(firstEmptySegment).reversedList()) {
newComponent.addFirstChild(child);
}
ListSequence.fromList(partialChild.getChildren()).removeWhere(new IWhereFilter<PQNode>() {
public boolean accept(PQNode it) {
return it.getState() != PQNode.State.FULL;
}
});
partialChild.collectEdgesOrderInSubtree(edgesOrder);
for (PQNode child : ListSequence.fromList(children).where(new IWhereFilter<PQNode>() {
public boolean accept(PQNode it) {
return it.getState() == PQNode.State.FULL;
}
})) {
child.collectEdgesOrderInSubtree(edgesOrder);
}
}
if (numPartialChildren == 2) {
PQNode partialChild0 = ListSequence.fromList(partialChildren).getElement(0);
List<PQNode> emptyNodes = ListSequence.fromList(partialChild0.getChildren()).where(new IWhereFilter<PQNode>() {
public boolean accept(PQNode it) {
return it.getState() == PQNode.State.EMPTY;
}
}).toListSequence();
emptyNodes = ListSequence.fromList(emptyNodes).reversedList();
for (PQNode child : ListSequence.fromList(emptyNodes)) {
newComponent.addFirstChild(child);
}
PQNode partialChild1 = ListSequence.fromList(partialChildren).getElement(1);
((QNode) partialChild1).reverse();
emptyNodes = ListSequence.fromList(partialChild1.getChildren()).where(new IWhereFilter<PQNode>() {
public boolean accept(PQNode it) {
return it.getState() == PQNode.State.EMPTY;
}
}).toListSequence();
for (PQNode child : ListSequence.fromList(emptyNodes)) {
newComponent.addLastChild(child);
}
/*
newComponent.getEdgesOrder().merge(partialChild0.getEdgesOrder());
for (PQNode child : ListSequence.fromList(partialChild0.getChildren()).where(new IWhereFilter<PQNode>() {
public boolean accept(PQNode it) {
return it.getState() == PQNode.State.FULL;
}
})) {
child.collectEdgesOrderInSubtree(edgesOrder);
}
*/
ListSequence.fromList(partialChild0.getChildren()).removeWhere(new IWhereFilter<PQNode>() {
public boolean accept(PQNode it) {
return it.getState() != PQNode.State.FULL;
}
});
partialChild0.collectEdgesOrderInSubtree(edgesOrder);
for (PQNode child : ListSequence.fromList(children).where(new IWhereFilter<PQNode>() {
public boolean accept(PQNode it) {
return it.getState() == PQNode.State.FULL;
}
})) {
child.collectEdgesOrderInSubtree(edgesOrder);
}
ListSequence.fromList(partialChild1.getChildren()).removeWhere(new IWhereFilter<PQNode>() {
public boolean accept(PQNode it) {
return it.getState() != PQNode.State.FULL;
}
});
partialChild1.collectEdgesOrderInSubtree(edgesOrder);
/*
newComponent.getEdgesOrder().merge(partialChild1.getEdgesOrder());
for (PQNode child : ListSequence.fromList(partialChild1.getChildren()).where(new IWhereFilter<PQNode>() {
public boolean accept(PQNode it) {
return it.getState() == PQNode.State.FULL;
}
})) {
child.collectEdgesOrderInSubtree(edgesOrder);
}
*/
}
return nextNode;
}