package com.github.pfichtner.jrunalyser.base.data.stat;
import static com.google.common.base.Functions.compose;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.TimeUnit;
import com.github.pfichtner.jrunalyser.base.data.Distance;
import com.github.pfichtner.jrunalyser.base.data.DistanceUnit;
import com.github.pfichtner.jrunalyser.base.data.Duration;
import com.github.pfichtner.jrunalyser.base.data.Gradient;
import com.github.pfichtner.jrunalyser.base.data.Link;
import com.github.pfichtner.jrunalyser.base.data.LinkedTrackPoint;
import com.github.pfichtner.jrunalyser.base.data.Speed;
import com.github.pfichtner.jrunalyser.base.data.WayPoint;
import com.github.pfichtner.jrunalyser.base.data.track.Id;
import com.github.pfichtner.jrunalyser.base.data.track.Metadata;
import com.github.pfichtner.jrunalyser.base.data.track.StatisticsProvider;
import com.github.pfichtner.jrunalyser.base.data.track.Track;
import com.google.common.base.Function;
import com.google.common.collect.Iterables;
public final class Functions {
public static class Tracks {
public static final Function<Track, Id> id = new Function<Track, Id>() {
public Id apply(Track track) {
return track.getId();
}
};
public static final Function<Track, List<? extends LinkedTrackPoint>> trackpoints = new Function<Track, List<? extends LinkedTrackPoint>>() {
public List<? extends LinkedTrackPoint> apply(Track track) {
return track.getTrackpoints();
}
};
public static final Function<Track, Metadata> metadata = new Function<Track, Metadata>() {
public Metadata apply(Track track) {
return track.getMetadata();
}
};
}
public static class Metadatas {
public static final Function<Metadata, String> name = new Function<Metadata, String>() {
public String apply(Metadata metadata) {
return metadata.getName();
}
};
public static final Function<Metadata, String> description = new Function<Metadata, String>() {
public String apply(Metadata metadata) {
return metadata.getDescription();
}
};
public static final Function<Metadata, Double> maxLatitude = new Function<Metadata, Double>() {
public Double apply(Metadata metadata) {
return Double.valueOf(metadata.getMaxLatitude());
}
};
public static final Function<Metadata, Double> minLatitude = new Function<Metadata, Double>() {
public Double apply(Metadata metadata) {
return Double.valueOf(metadata.getMinLatitude());
}
};
public static final Function<Metadata, Double> maxLongitude = new Function<Metadata, Double>() {
public Double apply(Metadata metadata) {
return Double.valueOf(metadata.getMaxLongitude());
}
};
public static final Function<Metadata, Double> minLongitude = new Function<Metadata, Double>() {
public Double apply(Metadata metadata) {
return Double.valueOf(metadata.getMinLongitude());
}
};
}
public static class StatisticsProviders {
public static final Function<StatisticsProvider, Statistics> statistics = new Function<StatisticsProvider, Statistics>() {
@Override
public Statistics apply(StatisticsProvider provider) {
return provider == null ? null : provider.getStatistics();
}
};
}
public static class Statisticss {
public static final Function<Statistics, Distance> distance = new Function<Statistics, Distance>() {
@Override
public Distance apply(Statistics statistics) {
return statistics.getDistance();
}
};
public static final Function<Statistics, Duration> duration = new Function<Statistics, Duration>() {
@Override
public Duration apply(Statistics statistics) {
return statistics.getDuration();
}
};
public static final Function<Statistics, LinkedTrackPoint> maxSpeed = new Function<Statistics, LinkedTrackPoint>() {
@Override
public LinkedTrackPoint apply(Statistics statistics) {
return statistics.getMaxSpeed();
}
};
public static final Function<Statistics, WayPoint> maxEle = new Function<Statistics, WayPoint>() {
@Override
public WayPoint apply(Statistics statistics) {
return statistics.getMaxElevation();
}
};
public static final Function<Statistics, WayPoint> minEle = new Function<Statistics, WayPoint>() {
@Override
public WayPoint apply(Statistics statistics) {
return statistics.getMinElevation();
}
};
public static final Function<Statistics, Integer> eleDiff = new Function<Statistics, Integer>() {
@Override
public Integer apply(Statistics statistics) {
return Integer.valueOf(statistics.getMaxElevation()
.getElevation().intValue()
- statistics.getMinElevation().getElevation()
.intValue());
}
};
public static final Function<Statistics, Speed> avgSpeed = new Function<Statistics, Speed>() {
@Override
public Speed apply(Statistics statistics) {
return statistics.getAvgSpeed();
}
};
}
public static class WayPoints {
private static final Function<WayPoint, Integer> elevation = new Function<WayPoint, Integer>() {
public Integer apply(WayPoint wayPoint) {
return wayPoint.getElevation();
}
};
private static final Function<WayPoint, Double> latitude = new Function<WayPoint, Double>() {
public Double apply(WayPoint wayPoint) {
return Double.valueOf(wayPoint.getLatitude());
}
};
private static final Function<WayPoint, Double> longitude = new Function<WayPoint, Double>() {
public Double apply(WayPoint wayPoint) {
return Double.valueOf(wayPoint.getLongitude());
}
};
private static final Function<WayPoint, Long> time = new Function<WayPoint, Long>() {
public Long apply(WayPoint wayPoint) {
return wayPoint.getTime();
}
};
private WayPoints() {
super();
}
public static Function<WayPoint, Integer> elevation() {
return elevation;
}
public static Function<WayPoint, Double> latitude() {
return latitude;
}
public static Function<WayPoint, Double> longitude() {
return longitude;
}
public static Function<WayPoint, Long> time() {
return time;
}
}
public static class LinkedWayPoints {
private static final Function<LinkedTrackPoint, Link> link = new Function<LinkedTrackPoint, Link>() {
public Link apply(LinkedTrackPoint wayPoint) {
return wayPoint.getLink();
}
};
private static final Function<LinkedTrackPoint, Integer> elevationDifference = new Function<LinkedTrackPoint, Integer>() {
public Integer apply(LinkedTrackPoint wayPoint) {
return Integer.valueOf(wayPoint.getLink()
.getElevationDifference());
}
};
private static final Function<LinkedTrackPoint, Speed> speed = compose(
Links.speed(), LinkedWayPoints.link());
private LinkedWayPoints() {
super();
}
public static Function<LinkedTrackPoint, Link> link() {
return link;
}
public static Function<LinkedTrackPoint, Integer> elevationDifference() {
return elevationDifference;
}
public static Function<LinkedTrackPoint, Speed> speed() {
return speed;
}
}
public static class Links {
private static final Function<Link, Speed> speed = new Function<Link, Speed>() {
public Speed apply(Link link) {
return link.getSpeed();
}
};
private static final Function<Link, Duration> duration = new Function<Link, Duration>() {
public Duration apply(Link link) {
return link.getDuration();
}
};
private static final Function<Link, Distance> distance = new Function<Link, Distance>() {
public Distance apply(Link link) {
return link.getDistance();
}
};
public static Function<Link, Speed> speed() {
return speed;
}
public static Function<Link, Duration> duration() {
return duration;
}
public static Function<Link, Distance> distance() {
return distance;
}
public final static Function<LinkedTrackPoint, Speed> speedOfLink = compose(
speed(), Functions.LinkedWayPoints.link());
}
public static class Speeds {
private static final Function<Speed, Double> value = new Function<Speed, Double>() {
public Double apply(Speed speed) {
return Double.valueOf(speed.getValue(speed.getDistanceUnit(),
speed.getTimeUnit()));
}
};
private Speeds() {
super();
}
public static Function<Speed, Double> value() {
return value;
}
public static Function<Speed, Speed> convert(
final DistanceUnit distanceUnit, final TimeUnit timeUnit) {
return new Function<Speed, Speed>() {
public Speed apply(Speed speed) {
return speed.convert(distanceUnit, timeUnit);
}
};
}
}
public static class Distances {
public static Function<Distance, DistanceUnit> distanceUnit = new Function<Distance, DistanceUnit>() {
@Override
public DistanceUnit apply(Distance distance) {
return distance.getDistanceUnit();
}
};
}
public static class Gradients {
public static Function<Gradient, DistanceUnit> distanceUnit = new Function<Gradient, DistanceUnit>() {
@Override
public DistanceUnit apply(Gradient gradient) {
return gradient.getDistanceUnit();
}
};
}
public static class Collections {
private static Function<? extends Collection<?>, ? extends Object> get0 = get(0);
public static <T> Function<Collection<? extends T>, T> get(final int idx) {
return new Function<Collection<? extends T>, T>() {
@Override
public T apply(Collection<? extends T> collection) {
return Iterables.get(collection, idx);
}
};
}
@SuppressWarnings("unchecked")
public static <T> Function<Collection<? extends T>, T> get0() {
return (Function<Collection<? extends T>, T>) get0;
}
}
}