function co($generator) { if (is_callable($generator)) { $args = array_slice(func_get_args(), 1); $generator = call_user_func_array($generator, $args); } if (!$generator instanceof \Generator) { return toFuture($generator); } $next = function ($yield) use($generator, &$next) { if ($generator->valid()) { return co($yield)->then(function ($value) use($generator, &$next) { $yield = $generator->send($value); if ($generator->valid()) { return $next($yield); } if (method_exists($generator, "getReturn")) { $result = $generator->getReturn(); return $result === null ? $value : $result; } return $value; }, function ($e) use($generator, &$next) { return $next($generator->throw($e)); }); } else { if (method_exists($generator, "getReturn")) { return value($generator->getReturn()); } else { return value(null); } } }; return $next($generator->current()); }
private function autoId() { $settings = new InvokeSettings(array('idempotent' => true, 'failswitch' => true)); $args = array(); return toFuture($this->invoke('#', $args, $settings)); }
function invokeHandler($name, array &$args, stdClass $context) { if ($context->isMissingMethod) { $args = array($name, $args); } $passContext = $context->passContext; if ($passContext === null) { $passContext = $this->passContext; } if ($context->async) { $self = $this; return promise(function ($resolve, $reject) use($self, $passContext, &$args, $context) { if ($passContext) { $args[] = $context; } $args[] = function ($value) use($resolve, $reject) { if ($value instanceof Exception || $value instanceof Throwable) { $reject($value); } else { $resolve($value); } }; $self->callService($args, $context); }); } else { if ($passContext) { $args[] = $context; } return toFuture($this->callService($args, $context)); } }