package pipe.controllers.arcCreator;
import uk.ac.imperial.pipe.models.petrinet.Connectable;
import uk.ac.imperial.pipe.models.petrinet.ArcPoint;
import uk.ac.imperial.pipe.models.petrinet.InboundArc;
import uk.ac.imperial.pipe.models.petrinet.OutboundArc;
import uk.ac.imperial.pipe.models.petrinet.Place;
import uk.ac.imperial.pipe.models.petrinet.Transition;
import java.util.List;
/**
* This class determines if arcs can be created from and to Petri net components and
* is responsible for creating the inbound/outbound arc models
*/
public interface ArcActionCreator {
/**
* Creates an inbound arc
* @param source of the arc
* @param target of the arc
* @param arcPoints on the arc
* @return inbound arc
*/
InboundArc createInboundArc(Place source, Transition target, List<ArcPoint> arcPoints);
/**
* Creates an outbound arc
* @param target of the arc
* @param source of the arc
* @param arcPoints on the arc
* @return outbound arc
*/
OutboundArc createOutboundArc(Place target, Transition source, List<ArcPoint> arcPoints);
/**
* Return true if can create an arc from source to target
* @param source of the arc
* @param target of the arc
* @param <S> source
* @param <T> target
* @return true if the arc can be created
*/
<S extends Connectable, T extends Connectable> boolean canCreate(S source, T target);
}