Return coroutines, will implement object access in promises in amphp

This commit is contained in:
Daniil Gentili 2019-09-22 00:06:14 +02:00
parent 383f3baff0
commit c66e1fcbef

View File

@ -203,14 +203,10 @@ final class Coroutine implements Promise, \ArrayAccess
*/ */
public function offsetGet($offset) public function offsetGet($offset)
{ {
$deferred = new Deferred; return Tools::call((function () use ($offset) {
$this->onResolve(static function ($e, $v) use ($deferred, $offset) { $result = yield $this;
if ($e) { return $result[$offset];
return $deferred->fail($e); })());
}
$deferred->resolve($v[$offset]);
});
return $deferred->promise();
} }
public function offsetSet($offset, $value) public function offsetSet($offset, $value)
{ {
@ -239,25 +235,17 @@ final class Coroutine implements Promise, \ArrayAccess
*/ */
public function __get(string $offset) public function __get(string $offset)
{ {
$deferred = new Deferred; return Tools::call((function () use ($offset) {
$this->onResolve(static function ($e, $v) use ($deferred, $offset) { $result = yield $this;
if ($e) { return $result->{$offset};
return $deferred->fail($e); })());
}
$deferred->resolve($v->{$offset});
});
return $deferred->promise();
} }
public function __call(string $name, array $arguments) public function __call(string $name, array $arguments)
{ {
$deferred = new Deferred; return Tools::call((function () use ($name, $arguments) {
$this->onResolve(static function ($e, $v) use ($deferred, $name, $arguments) { $result = yield $this;
if ($e) { return $result->{$name}($arguments);
return $deferred->fail($e); })());
}
$deferred->resolve($v->{$name}(...$arguments));
});
return $deferred->promise();
} }
/** /**
* Get stacktrace from when the generator was started. * Get stacktrace from when the generator was started.