package org.scribble.model.endpoint;
import java.util.List;
import java.util.stream.Collectors;
import org.scribble.model.endpoint.actions.EAction;
// Factor out with SModel?
public class EFSM
{
public final EGraph graph;
public final EState curr;
protected EFSM(EGraph graph)
{
this(graph, graph.init);
}
protected EFSM(EGraph graph, EState curr)
{
this.graph = graph;//new EGraph(init, term);
this.curr = curr;
}
/*public EndpointState getCurrent()
{
return this.curr;
}*/
// CHECKME: check if unfolded initial accept is possible, and if it breaks anything
public boolean isInitial()
{
return this.curr.equals(this.graph.init);
}
public boolean isTerminated()
{
return this.curr.isTerminal();
}
public EStateKind getStateKind()
{
return this.curr.getStateKind();
}
public List<EFSM> fireAll(EAction a)
{
return this.curr.getSuccessors(a).stream().map((s) -> new EFSM(this.graph, s)).collect(Collectors.toList());
}
public List<EAction> getAllFireable()
{
return this.curr.getAllActions();
}
public boolean hasFireable(EAction a)
{
return this.curr.hasAction(a);
}
public boolean isConnectOrWrapClientOnly()
{
return this.curr.isConnectOrWrapClientOnly();
}
@Override
public final int hashCode()
{
int hash = 1049;
hash = 31 * hash + this.graph.init.hashCode();
hash = 31 * hash + this.curr.hashCode();
return hash;
}
@Override
public boolean equals(Object o)
{
if (this == o)
{
return true;
}
if (!(o instanceof EFSM))
{
return false;
}
EFSM them = (EFSM) o;
return this.graph.equals(them.graph) && this.curr.equals(them.curr);
}
@Override
public String toString()
{
return Integer.toString(this.curr.id);
}
}