From e3bdce53906dc14ee9ab168976b2fbb9a3681a21 Mon Sep 17 00:00:00 2001 From: VennV <111500380+VennDev@users.noreply.github.com> Date: Tue, 18 Jul 2023 03:10:29 +0700 Subject: [PATCH] Improved performance and quality. --- src/vennv/vapm/EventLoop.php | 8 ++- src/vennv/vapm/GeneratorManager.php | 57 ++++++++++++++++++++ src/vennv/vapm/GeneratorManagerInterface.php | 51 ++++++++++++++++++ src/vennv/vapm/GreenThread.php | 3 +- src/vennv/vapm/Info.php | 2 +- src/vennv/vapm/MacroTask.php | 3 +- src/vennv/vapm/MicroTask.php | 6 ++- src/vennv/vapm/Promise.php | 16 +++--- src/vennv/vapm/PromiseResult.php | 52 ++++++++++++++++++ src/vennv/vapm/PromiseResultInterface.php | 36 +++++++++++++ virion.yml | 2 +- 11 files changed, 222 insertions(+), 14 deletions(-) create mode 100644 src/vennv/vapm/GeneratorManager.php create mode 100644 src/vennv/vapm/GeneratorManagerInterface.php create mode 100644 src/vennv/vapm/PromiseResult.php create mode 100644 src/vennv/vapm/PromiseResultInterface.php diff --git a/src/vennv/vapm/EventLoop.php b/src/vennv/vapm/EventLoop.php index 167e0b5d..4b1a8420 100644 --- a/src/vennv/vapm/EventLoop.php +++ b/src/vennv/vapm/EventLoop.php @@ -113,10 +113,12 @@ public static function getReturns(): array private static function clearGarbage(): void { - foreach (self::$returns as $id => $promise) + foreach (GeneratorManager::getFromArray(self::$returns) as $id => $promise) { + /** @var Promise $promise */ if ($promise->canDrop()) { + /** @var int $id */ self::removeReturn($id); } } @@ -132,8 +134,9 @@ protected static function run(): void GreenThread::run(); } - foreach (self::$queues as $id => $promise) + foreach (GeneratorManager::getFromArray(self::$queues) as $id => $promise) { + /** @var Promise $promise */ $fiber = $promise->getFiber(); if ($fiber->isSuspended()) @@ -147,6 +150,7 @@ protected static function run(): void if ($fiber->isTerminated() && ($promise->getStatus() !== StatusPromise::PENDING || $promise->isJustGetResult())) { + /** @var int $id */ MicroTask::addTask($id, $promise); self::removeQueue($id); } diff --git a/src/vennv/vapm/GeneratorManager.php b/src/vennv/vapm/GeneratorManager.php new file mode 100644 index 00000000..f38f3f37 --- /dev/null +++ b/src/vennv/vapm/GeneratorManager.php @@ -0,0 +1,57 @@ + $array + * + * This method is used to get a generator from an array. + */ + public static function getFromArray(array $array): Generator + { + yield from $array; + } + + /** + * @param Generator $generator + * @return Generator + * + * This method is used to get a generator from a generator. + */ + public static function getFromGenerator(Generator $generator): Generator + { + yield from $generator; + } + +} \ No newline at end of file diff --git a/src/vennv/vapm/GeneratorManagerInterface.php b/src/vennv/vapm/GeneratorManagerInterface.php new file mode 100644 index 00000000..75859f2f --- /dev/null +++ b/src/vennv/vapm/GeneratorManagerInterface.php @@ -0,0 +1,51 @@ + $array + * + * This method is used to get a generator from an array. + */ + public static function getFromArray(array $array): Generator; + + /** + * @param Generator $generator + * @return Generator + * + * This method is used to get a generator from a generator. + */ + public static function getFromGenerator(Generator $generator): Generator; + +} \ No newline at end of file diff --git a/src/vennv/vapm/GreenThread.php b/src/vennv/vapm/GreenThread.php index 41c979db..dec83c0e 100644 --- a/src/vennv/vapm/GreenThread.php +++ b/src/vennv/vapm/GreenThread.php @@ -80,7 +80,7 @@ public static function register(string|int $name, callable $callback, array $par */ public static function run(): void { - foreach (self::$fibers as $i => $fiber) + foreach (GeneratorManager::getFromArray(self::$fibers) as $i => $fiber) { if (!self::$status[self::$names[$i]]->canWakeUp()) { @@ -91,6 +91,7 @@ public static function run(): void try { + /** @var Fiber $fiber */ if (!$fiber->isStarted()) { $fiber->start(...self::$params[$i]); diff --git a/src/vennv/vapm/Info.php b/src/vennv/vapm/Info.php index 66c2cab6..6e43600e 100644 --- a/src/vennv/vapm/Info.php +++ b/src/vennv/vapm/Info.php @@ -29,7 +29,7 @@ class Info { - public const VERSION = "1.6.1"; + public const VERSION = "1.6.7"; public const AUTHOR = "VennV"; diff --git a/src/vennv/vapm/MacroTask.php b/src/vennv/vapm/MacroTask.php index cac27b3a..9315981e 100644 --- a/src/vennv/vapm/MacroTask.php +++ b/src/vennv/vapm/MacroTask.php @@ -78,8 +78,9 @@ public static function getTasks(): array public static function run(): void { - foreach (self::$tasks as $task) + foreach (GeneratorManager::getFromArray(self::$tasks) as $task) { + /** @var SampleMacro $task */ if ($task->checkTimeOut()) { $task->run(); diff --git a/src/vennv/vapm/MicroTask.php b/src/vennv/vapm/MicroTask.php index b7d5e722..55c161b8 100644 --- a/src/vennv/vapm/MicroTask.php +++ b/src/vennv/vapm/MicroTask.php @@ -65,8 +65,12 @@ public static function getTasks(): array */ public static function run(): void { - foreach (self::$tasks as $id => $promise) + foreach (GeneratorManager::getFromArray(self::$tasks) as $id => $promise) { + /** + * @var Promise $promise + * @var int $id + */ $promise->useCallbacks(); $promise->setTimeEnd(microtime(true)); diff --git a/src/vennv/vapm/Promise.php b/src/vennv/vapm/Promise.php index 3dbc38fe..d405a307 100644 --- a/src/vennv/vapm/Promise.php +++ b/src/vennv/vapm/Promise.php @@ -300,7 +300,7 @@ private function checkStatus(array $callbacks, mixed $return) : void { $cancel = false; - foreach ($callbacks as $case => $callable) + foreach (GeneratorManager::getFromArray($callbacks) as $case => $callable) { if ($return === null) { @@ -317,6 +317,7 @@ private function checkStatus(array $callbacks, mixed $return) : void if (!is_null($queue1)) { + /** @var callable $callable */ $queue1->then($callable); if (is_callable($this->callbackReject)) @@ -326,6 +327,7 @@ private function checkStatus(array $callbacks, mixed $return) : void } elseif (!is_null($queue2)) { + /** @var callable $callable */ $queue2->then($callable); if (is_callable($this->callbackReject)) @@ -365,7 +367,7 @@ public static function all(array $promises): Promise while ($isSolved === false) { - foreach ($promises as $promise) + foreach (GeneratorManager::getFromArray($promises) as $promise) { if (is_callable($promise)) { @@ -417,14 +419,14 @@ public static function all(array $promises): Promise */ public static function allSettled(array $promises): Promise { - $promise = new Promise(function($resolve, $reject) use ($promises): void + $promise = new Promise(function($resolve) use ($promises): void { $results = []; $isSolved = false; while ($isSolved === false) { - foreach ($promises as $promise) + foreach (GeneratorManager::getFromArray($promises) as $promise) { if (is_callable($promise)) { @@ -437,7 +439,7 @@ public static function allSettled(array $promises): Promise if ($return !== null) { - $results[] = $return->getResult(); + $results[] = new PromiseResult($return->getStatus(), $return->getResult()); } } @@ -474,7 +476,7 @@ public static function any(array $promises): Promise while ($isSolved === false) { - foreach ($promises as $promise) + foreach (GeneratorManager::getFromArray($promises) as $promise) { if (is_callable($promise)) { @@ -532,7 +534,7 @@ public static function race(array $promises): Promise while ($isSolved === false) { - foreach ($promises as $promise) + foreach (GeneratorManager::getFromArray($promises) as $promise) { if (is_callable($promise)) { diff --git a/src/vennv/vapm/PromiseResult.php b/src/vennv/vapm/PromiseResult.php new file mode 100644 index 00000000..3c5d0815 --- /dev/null +++ b/src/vennv/vapm/PromiseResult.php @@ -0,0 +1,52 @@ +status = $status; + $this->result = $result; + } + + public function getStatus(): string + { + return $this->status; + } + + public function getResult(): mixed + { + return $this->result; + } + +} \ No newline at end of file diff --git a/src/vennv/vapm/PromiseResultInterface.php b/src/vennv/vapm/PromiseResultInterface.php new file mode 100644 index 00000000..da7ef633 --- /dev/null +++ b/src/vennv/vapm/PromiseResultInterface.php @@ -0,0 +1,36 @@ +