package com.github.pfichtner.jrunalyser.base.data;
import static com.google.common.collect.Iterables.filter;
import static com.google.common.collect.Range.atMost;
import java.util.EnumSet;
import java.util.List;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;
public final class Distances {
private Distances() {
super();
}
private static final Distance ZERO = DefaultDistance.of(0,
DistanceUnit.METERS);
private static final Iterable<Distance> distances = ImmutableList
.copyOf(Ordering.natural().sortedCopy(all()));
private static Iterable<Distance> all() {
List<Distance> result = Lists.<Distance> newArrayList(
DefaultDistance.of(400, DistanceUnit.METERS),
DefaultDistance.of(0.5, DistanceUnit.MILES));
for (DistanceUnit distanceUnit : sort(EnumSet.of(
DistanceUnit.KILOMETERS, DistanceUnit.MILES))) {
for (int i : new int[] { 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000,
2500, 5000 }) {
result.add(DefaultDistance.of(i, distanceUnit));
}
}
return result;
}
private static final List<Distance> defaultDistances = sort(Lists
.newArrayList(distanceIterator(DefaultDistance.of(10,
DistanceUnit.MILES))));
private static <T extends Comparable<T>> List<T> sort(Iterable<T> build) {
return ImmutableList.copyOf(Ordering.natural().sortedCopy(build));
}
public static Iterable<Distance> getDefaultDistances() {
return defaultDistances;
}
public static Iterable<Distance> distanceIterator(Distance upto) {
return filter(distances, atMost(upto));
}
public static Distance abs(Distance distance) {
return distance.compareTo(ZERO) >= 0 ? distance : reverse(distance);
}
public static Distance reverse(Distance distance) {
DistanceUnit du = distance.getDistanceUnit();
return DefaultDistance.of(0 - distance.getValue(du), du);
}
}