71 lines
1.8 KiB
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);
|
|
}
|
|
} |