package com.github.pfichtner.jrunalyser.base.data; import java.io.Serializable; import java.util.concurrent.TimeUnit; import com.google.common.primitives.Doubles; public class DefaultPace implements Pace, Serializable { private static final long serialVersionUID = -82131255646159944L; private final double tPerD; private final TimeUnit timeUnit; private final DistanceUnit distanceUnit; private static final long fix = TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS); public DefaultPace(double tPerD, TimeUnit timeUnit, DistanceUnit distanceUnit) { this.tPerD = tPerD; this.timeUnit = timeUnit; this.distanceUnit = distanceUnit; } protected static DefaultPace of(Speed speed, TimeUnit timeUnit, DistanceUnit distanceUnit) { return new DefaultPace(1 / speed.getValue(distanceUnit, timeUnit), timeUnit, distanceUnit); } @Override public DistanceUnit getDistanceUnit() { return this.distanceUnit; } @Override public TimeUnit getTimeUnit() { return this.timeUnit; } @Override public double getValue(TimeUnit timeUnit, DistanceUnit distanceUnit) { return convert(timeUnit, distanceUnit).tPerD; } public DefaultPace convert(TimeUnit timeUnit, DistanceUnit distanceUnit) { if (distanceUnit == this.distanceUnit && timeUnit == this.timeUnit) { return this; } long longDist = (long) (fix * this.distanceUnit.convert(this.tPerD, distanceUnit)); return new DefaultPace((double) (timeUnit.convert(longDist, this.timeUnit)) / fix, timeUnit, distanceUnit); } @Override public Speed toSpeed(DistanceUnit distanceUnit, TimeUnit timeUnit) { return new DefaultSpeed(1 / getValue(timeUnit, distanceUnit), distanceUnit, timeUnit); } @Override public String toString() { return this.tPerD + " " + this.timeUnit + " per " + this.distanceUnit; } public int compareTo(Pace o) { return 0 - Doubles.compare(getValue(this.timeUnit, this.distanceUnit), o.getValue(this.timeUnit, this.distanceUnit)); } }