package org.scribble.ast;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;
import org.antlr.runtime.tree.CommonTree;
import org.scribble.main.ScribbleException;
import org.scribble.sesstype.kind.ProtocolKind;
import org.scribble.visit.AstVisitor;
public abstract class Parallel<K extends ProtocolKind> extends CompoundInteractionNode<K>
{
private final List<? extends ProtocolBlock<K>> blocks;
protected Parallel(CommonTree source, List<? extends ProtocolBlock<K>> blocks)
{
super(source);
this.blocks = new LinkedList<>(blocks);
}
public abstract Parallel<K> reconstruct(List<? extends ProtocolBlock<K>> blocks);
@Override
public Parallel<K> visitChildren(AstVisitor nv) throws ScribbleException
{
List<? extends ProtocolBlock<K>> blocks = visitChildListWithClassEqualityCheck(this, this.blocks, nv);
return reconstruct(blocks);
}
public List<? extends ProtocolBlock<K>> getBlocks()
{
return Collections.unmodifiableList(this.blocks);
}
/*@Override
public NodeContextBuilder enterContextBuilding(NodeContextBuilder builder) throws ScribbleException
{
builder.pushContext(new CompoundInteractionNodeContext());
return builder;
}
@Override
public Parallel<T> leaveContextBuilding(NodeContextBuilder builder) throws ScribbleException
{
CompoundInteractionNodeContext pcontext = (CompoundInteractionNodeContext) builder.popContext();
List<ProtocolBlockContext> bcontexts =
this.blocks.stream().map((b) -> b.getContext()).collect(Collectors.toList());
pcontext = (CompoundInteractionNodeContext) pcontext.merge(bcontexts);
builder.replaceContext(((CompoundInteractionContext) builder.peekContext()).merge(pcontext));
//return new Parallel<>(this.ct, this.blocks, pcontext);
return reconstruct(this.ct, this.blocks, pcontext, getEnv());
}
@Override
public Parallel<T> leaveWFChoiceCheck(WellFormedChoiceChecker checker) throws ScribbleException
{
checker.getEnv().leave(this, checker);
return this;
}
@Override
public Parallel<T> leaveReachabilityCheck(ReachabilityChecker checker) throws ScribbleException
{
checker.getEnv().leave(this, checker);
return this;
}
/*@Override
public Parallel checkWellFormedness(WellFormednessChecker wfc) throws ScribbleException
{k
return visitWithEnv(wfc);
}
@Override
public Parallel project(Projector proj) throws ScribbleException
{
return visitWithEnv(proj);
}
@Override
public Parallel checkReachability(ReachabilityChecker rc) throws ScribbleException
{
return visitWithEnv(rc);
}
public Parallel visitWithEnv(EnvVisitor nv) throws ScribbleException
{
Env env = nv.getEnv();
List<ProtocolBlock> blocks = new LinkedList<>();
for (ProtocolBlock block : this.blocks)
{
nv.setEnv(new Env(env));
ProtocolBlock visited = (ProtocolBlock) nv.visit(block);
blocks.add(visited);
}
nv.setEnv(env);
return new Parallel(this.ct, blocks);
}*/
@Override
public String toString()
{
String sep = " " + Constants.AND_KW + " ";
return Constants.PAR_KW + " "
+ this.blocks.stream().map((block) -> block.toString()).collect(Collectors.joining(sep));
}
}