package net.varkhan.data.diff; import net.varkhan.base.containers.Container; import net.varkhan.base.containers.Iterable; /** * <b>A difference analyzer</b>. * <p/> * * @author varkhan * @date 9/21/14 * @time 1:09 PM */ public interface Diff<T,S extends Container<T>,X> { public Iterable<Block<T>> invoke(S srcL, S srcR, X ctx); /** * <b>A difference block</b>. * <p/> * This block contains the set of differences between two sources (left and right). * <p/> * The methods' contract is that * <pre>0 <= begL() <= endL()</pre> * <pre>0 <= begR() <= endR()</pre> * <pre>endL()-begL() == blockL().size()</pre> * <pre>endR()-begR() == blockR().size()</pre> * In addition, both {@code blockL()} and {@code blockR()} cannot be simultaneously * empty (or equivalently: {@code endL()-begL() == 0 == endR()-begR()} is never true). * <p/> */ public static interface Block<T> { public int begL(); public int begR(); public int endL(); public int endR(); public Container<T> blockL(); public Container<T> blockR(); } }