public function scheduleRecursive(callable $action)
{
if (!is_callable($action)) {
throw new InvalidArgumentException("Action should be a callable.");
}
$goAgain = true;
$disposable = new CompositeDisposable();
$recursiveAction = function () use($action, &$goAgain, $disposable) {
while ($goAgain) {
$goAgain = false;
$disposable->add($this->schedule(function () use($action, &$goAgain, $disposable) {
return $action(function () use(&$goAgain, $action) {
$goAgain = true;
});
}));
}
};
$disposable->add($this->schedule($recursiveAction));
return $disposable;
}
public function subscribe(ObserverInterface $observer, SchedulerInterface $scheduler = null) { if ($this->scheduler !== null) { $scheduler = $this->scheduler; } if ($scheduler === null) { $scheduler = new ImmediateScheduler(); } $i = 0; return $scheduler->scheduleRecursive(function ($reschedule) use(&$observer, &$i) { if ($i < $this->count) { $observer->onNext($this->start + $i); $i++; $reschedule(); } else { $observer->onCompleted(); } }); }