package com.github.pfichtner.jrunalyser.base.data;
import java.util.concurrent.TimeUnit;
import com.google.common.collect.Ordering;
public final class Speeds {
public static class SpeedComparator {
public class Result {
private final Speed comparedTo;
public Result(Speed comparedTo) {
this.comparedTo = comparedTo;
}
public double asMultiplicator() {
Speed s1 = this.comparedTo;
Speed s2 = SpeedComparator.this.reference;
DistanceUnit lowerDu = lowerDu(s1, s2);
TimeUnit lowerTu = lowerTu(s1, s2);
return s2.getValue(lowerDu, lowerTu)
/ s1.getValue(lowerDu, lowerTu);
}
private TimeUnit lowerTu(Speed s1, Speed s2) {
return min(s1.getTimeUnit(), s2.getTimeUnit());
}
private DistanceUnit lowerDu(Speed s1, Speed s2) {
return min(s1.getDistanceUnit(), s2.getDistanceUnit());
}
private <T extends Comparable<T>> T min(T val1, T tu2) {
return Ordering.natural().min(val1, tu2);
}
public int inPercent() {
return (int) (asMultiplicator() * 100 - 100);
}
}
private final Speed reference;
public SpeedComparator(Speed reference) {
this.reference = reference;
}
public Result fasterThan(Speed compareTo) {
return new Result(compareTo);
}
}
private Speeds() {
super();
}
public static SpeedComparator is(Speed reference) {
return new SpeedComparator(reference);
}
}