app/utils/Stats.scala (23 lines of code) (raw):
package utils
case class Percentiles(values: Seq[Int]) {
private val percentilesRange: Range = 0 to 100
private def percentile(s: Seq[Int], p: Int): Option[Int] = {
if (p < percentilesRange.min || p > percentilesRange.max) None
s.sortWith(_ < _) match {
case Nil => None
case nonEmptySeq =>
Some(
nonEmptySeq(
Math.ceil((s.length - 1) * p / percentilesRange.max).toInt
)
)
}
}
def p95 = percentile(values, 95)
def p90 = percentile(values, 90)
def p75 = percentile(values, 75)
def p50 = percentile(values, 50)
def p25 = percentile(values, 25)
def lowest = percentile(values, percentilesRange.min)
def highest = percentile(values, percentilesRange.max)
}