package models.objectOrientedTransfer;
import java.util.ArrayList;
import java.util.List;
/**
* A dependency-composed closed delta
*
* @author Nitta
*
*/
public class DeltaComplex {
private Delta frontierDelta;
private DeltaComplex subComplex = null;
public DeltaComplex(Delta delta) {
this.frontierDelta = delta;
}
public DeltaComplex(Delta frontierDelta, DeltaComplex subComplex) {
this.frontierDelta = frontierDelta;
this.subComplex = subComplex;
}
/**
* dependency composition
* (this = delta | this)
*
* @param delta
*/
public void attach(Delta delta) {
this.subComplex = this.copy();
this.frontierDelta = delta;
}
/**
* if this = d1 | d2 | ... | dn
*
* @return [d1, d2, ..., dn]
*/
public List<Delta> split() {
if (subComplex == null) {
List<Delta> deltaSequence = new ArrayList<>();
deltaSequence.add(frontierDelta);
return deltaSequence;
}
List<Delta> deltaSequence = subComplex.split();
deltaSequence.add(0, frontierDelta);
return deltaSequence;
}
public Delta collapse() {
Delta allDelta = null;
for (Delta delta: this.split()) {
if (allDelta == null) {
allDelta = delta;
} else {
allDelta = allDelta.combine(delta);
}
}
return allDelta;
}
public DeltaComplex copy() {
if (subComplex == null) {
return new DeltaComplex(frontierDelta.copy());
}
return new DeltaComplex(frontierDelta.copy(), subComplex.copy());
}
}