public function testPseudoReturn() { $gen = (function () { $this->assertEquals(2, (yield 1)); $this->assertEquals(4, (yield 3)); (yield CoInterface::RETURN_WITH => 5); })(); $con = new GeneratorContainer($gen); $this->assertEquals($con->current(), 1); $con->send(2); $this->assertEquals($con->current(), 3); $con->send(4); $this->assertFalse($con->valid()); $this->assertEquals(5, $con->getReturnOrThrown()); $this->setExpectedException(\LogicException::class); $con->send(null); }
/** * Handle resolving generators still running. * @param GeneratorContainer $gc * @return PromiseInterface */ private function processGeneratorContainerRunning(GeneratorContainer $gc) { // Check delay request yields if ($gc->key() === CoInterface::DELAY) { return $this->pool->addDelay($gc->current())->then(function () use($gc) { $gc->send(null); return $this->processGeneratorContainer($gc); }); } // Now we normalize yielded value $yielded = YieldableUtils::normalize($gc->current()); $yieldables = YieldableUtils::getYieldables($yielded, [], $this->runners); if (!$yieldables) { // If there are no yieldables, send yielded value back into generator $gc->send($yielded); // Continue return $this->processGeneratorContainer($gc); } // Chain resolver return $this->promiseAll($yieldables, $gc->key() !== CoInterface::SAFE)->then(YieldableUtils::getApplier($yielded, $yieldables, [$gc, 'send']), [$gc, 'throw_'])->then(function () use($gc, $yieldables) { // Continue $this->runners = array_diff_key($this->runners, $yieldables); return $this->processGeneratorContainer($gc); }); }