* @copyright 2016-2020 Daniil Gentili * @license https://opensource.org/licenses/MIT MIT */ namespace danog\Loop\Test\Traits; use danog\Loop\Interfaces\ResumableLoopInterface; use function Amp\async; use function Amp\delay; trait Signal { use Resumable; /** * Signaled payload. * */ private $payload; /** * Signaled exception. * * @var ?\Throwable */ private $exception; /** * Get signaled payload. * */ public function getPayload() { return $this->payload; } /** * Get signaled exception. */ public function getException(): ?\Throwable { return $this->exception; } /** * Test waiting signal on interval. * * @param integer $interval Interval */ private function testGenerator(int $interval): void { delay($interval/1000); } /** * Loop implementation. * */ public function loop(): void { $this->inited = true; try { while (true) { $this->payload = $this->waitSignal(async(fn () => $this instanceof ResumableLoopInterface ? $this->pause($this->interval) : $this->testGenerator($this->interval))); } } catch (\Throwable $e) { $this->exception = $e; } $this->ran = true; } }