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); } }