package net.minecraft.util.profiling.jfr.stats; import java.time.Duration; import java.util.Comparator; import java.util.List; import java.util.Map; import net.minecraft.util.profiling.jfr.Percentiles; import org.jetbrains.annotations.Nullable; public record TimedStatSummary( T fastest, T slowest, @Nullable T secondSlowest, int count, Map percentilesNanos, Duration totalDuration ) { public static TimedStatSummary summary(List stats) { if (stats.isEmpty()) { throw new IllegalArgumentException("No values"); } else { List list = stats.stream().sorted(Comparator.comparing(TimedStat::duration)).toList(); Duration duration = (Duration)list.stream().map(TimedStat::duration).reduce(Duration::plus).orElse(Duration.ZERO); T timedStat = (T)list.get(0); T timedStat2 = (T)list.get(list.size() - 1); T timedStat3 = (T)(list.size() > 1 ? list.get(list.size() - 2) : null); int i = list.size(); Map map = Percentiles.evaluate(list.stream().mapToLong(timedStatx -> timedStatx.duration().toNanos()).toArray()); return new TimedStatSummary<>(timedStat, timedStat2, timedStat3, i, map, duration); } } }