package org.scribble.visit.context.env;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import org.scribble.sesstype.name.Role;
import org.scribble.visit.env.Env;
// Cf. UnfoldingEnv
public class UnguardedChoiceDoEnv extends Env<UnguardedChoiceDoEnv>
{
//private boolean shouldPrune;
public Set<Role> subjs; // If well-formed (including wrt. local choice syntax) should be a singleton: but this is currently checked in subsequent choice subject inference pass, not here
public UnguardedChoiceDoEnv()
{
//this.shouldPrune = true;
this.subjs = new HashSet<>();
}
//protected ChoiceUnguardedSubprotocolEnv(boolean shouldPrune, Set<Role> subjs)
protected UnguardedChoiceDoEnv(Set<Role> subjs)
{
//this.shouldPrune = shouldUnfold;
this.subjs = new HashSet<>(subjs);
}
@Override
protected UnguardedChoiceDoEnv copy()
{
//return new ChoiceUnguardedSubprotocolEnv(this.shouldPrune, this.subjs);
return new UnguardedChoiceDoEnv(this.subjs);
}
@Override
public UnguardedChoiceDoEnv enterContext()
{
return copy();
}
@Override
public UnguardedChoiceDoEnv mergeContext(UnguardedChoiceDoEnv env)
{
return mergeContexts(Arrays.asList(env));
}
@Override
public UnguardedChoiceDoEnv mergeContexts(List<UnguardedChoiceDoEnv> envs)
{
UnguardedChoiceDoEnv copy = copy();
//copy.shouldPrune = (envs.stream().filter((e) -> !e.shouldPrune).count() > 0); // Look for false, cf. UnfoldingEnv
//copy.subjs = envs.stream().flatMap((e) -> e.subjs.stream()).collect(Collectors.toSet());
copy.subjs.addAll(envs.stream().flatMap((e) -> e.subjs.stream()).collect(Collectors.toSet()));
//System.out.println("ddd1: " + envs);
//System.out.println("ddd2: " + copy.subjs);
return copy;
}
public UnguardedChoiceDoEnv setChoiceSubject(Role r)
{
UnguardedChoiceDoEnv copy = copy();
if (copy.subjs.isEmpty())
{
//System.out.println("BBB: " + r);
copy.subjs.add(r);
}
return copy;
}
/*public boolean shouldPrune()
{
return this.shouldPrune;
}
public ChoiceUnguardedSubprotocolEnv disablePrune()
{
ChoiceUnguardedSubprotocolEnv copy = copy();
copy.shouldPrune = false;
return copy;
}*/
@Override
public String toString()
{
return super.toString() + ": " + this.subjs;
}
}