php-histogram/src/Buffer.php

71 lines
1.8 KiB
PHP

<?php
namespace NoccyLabs\Histogram;
use Countable;
class Buffer implements Countable
{
private $samples = [];
private $maxSamples = 50;
public function __construct(int $maxSamples=50)
{
$this->maxSamples = max(1, $maxSamples);
}
public function count(): int
{
return count($this->samples);
}
public function pushSamples(...$samples)
{
array_push($this->samples, ...$samples);
$this->trim();
}
public function getSampleMax(): float
{
return (float)max($this->samples);
}
public function getSampleMin(): float
{
return (float)min($this->samples);
}
public function getSampleAverage(): ?float
{
$clean = array_filter($this->samples, function ($s) { return $s !== null; });
if (count($clean) === 0)
return null;
$total = array_sum($clean);
$average = $total / count($clean);
return (float)$average;
}
public function getMappedSamples(float $inMin, float $inMax, float $outMin=0.0, float $outMax=1.0, ?int $numSamples=null)
{
$map = function ($v) use ($inMin, $inMax, $outMin, $outMax) {
if ($v === null) return null;
$v = max($inMin, min($inMax, $v));
return (($v - $inMin) / ($inMax - $inMin)) * ($outMax - $outMin) + $outMin;
};
return array_map($map, $numSamples?array_slice($this->samples,-$numSamples,$numSamples):$this->samples);
}
public function getSamples(?int $numSamples=null)
{
return $numSamples?array_slice($this->samples,-$numSamples,$numSamples):$this->samples;
}
private function trim()
{
while (count($this->samples) > $this->maxSamples)
array_shift($this->samples);
}
}