public function schedulePeriodic(callable $action, $delay, $period)
{
$now = $this->now();
$nextTime = $now + $delay;
$disposable = new SerialDisposable();
$doActionAndReschedule = function () use(&$nextTime, $period, $disposable, $action, &$doActionAndReschedule) {
$action();
$nextTime = $nextTime + $period;
$delay = $nextTime - $this->now();
if ($delay < 0) {
$delay = 0;
}
$disposable->setDisposable($this->schedule($doActionAndReschedule, $delay));
};
$disposable->setDisposable($this->schedule($doActionAndReschedule, $delay));
return $disposable;
}