package mf;
/*Generated by MPS */
import java.util.Date;
import java.util.Arrays;
public class DateRange implements Comparable {
public static DateRange EMPTY = new DateRange(new MfDate(2000, 4, 1), new MfDate(2000, 1, 1));
private MfDate myStart;
private MfDate myEnd;
public DateRange(Date start, Date end) {
this(new MfDate(start), new MfDate(end));
}
public DateRange(MfDate start, MfDate end) {
this.myStart = start;
this.myEnd = end;
}
public MfDate end() {
return myEnd;
}
public MfDate start() {
return myStart;
}
@Override
public String toString() {
if (isEmpty()) {
return "Empty Date Range";
}
return myStart.toString() + " - " + myEnd.toString();
}
public boolean isEmpty() {
return myStart.after(myEnd);
}
public boolean includes(MfDate arg) {
return !(arg.before(myStart)) && !(arg.after(myEnd));
}
@Override
public boolean equals(Object arg) {
if (!((arg instanceof DateRange))) {
return false;
}
DateRange other = (DateRange) arg;
return myStart.equals(other.myStart) && myEnd.equals(other.myEnd);
}
@Override
public int hashCode() {
return myStart.hashCode();
}
public boolean overlaps(DateRange arg) {
return arg.includes(myStart) || arg.includes(myEnd) || this.includes(arg);
}
public boolean includes(DateRange arg) {
return this.includes(arg.myStart) && this.includes(arg.myEnd);
}
public DateRange gap(DateRange arg) {
if (this.overlaps(arg)) {
return EMPTY;
}
DateRange lower;
DateRange higher;
if (this.compareTo(arg) < 0) {
lower = this;
higher = arg;
} else {
lower = arg;
higher = this;
}
return new DateRange(lower.myEnd.addDays(1), higher.myStart.addDays(-1));
}
@Override
public int compareTo(Object arg) {
DateRange other = (DateRange) arg;
if (!(myStart.equals(other.myStart))) {
return myStart.compareTo(other.myStart);
}
return myEnd.compareTo(other.myEnd);
}
public boolean abuts(DateRange arg) {
return !(this.overlaps(arg)) && this.gap(arg).isEmpty();
}
public boolean partitionedBy(DateRange[] args) {
if (!(DateRange.isContiguous(args))) {
return false;
}
return this.equals(DateRange.combination(args));
}
public static DateRange upTo(MfDate end) {
return new DateRange(MfDate.PAST, end);
}
public static DateRange startingOn(MfDate start) {
return new DateRange(start, MfDate.FUTURE);
}
public static DateRange combination(DateRange[] args) {
Arrays.sort(args);
if (!(DateRange.isContiguous(args))) {
throw new IllegalArgumentException("Unable to combine date ranges");
}
return new DateRange(args[0].myStart, args[args.length - 1].myEnd);
}
public static boolean isContiguous(DateRange[] args) {
Arrays.sort(args);
for (int i = 0; i < args.length - 1; i++) {
if (!(args[i].abuts(args[i + 1]))) {
return false;
}
}
return true;
}
}