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