1
0
mirror of https://github.com/danog/loop.git synced 2024-11-30 04:19:04 +01:00

Update docs

This commit is contained in:
Daniil Gentili 2023-01-23 22:19:50 +01:00
parent 3f7cf21547
commit bdeb4b05dc
6 changed files with 212 additions and 2 deletions

View File

@ -184,5 +184,3 @@ class PeriodicLoop extends GenericLoop
}
```
`PeriodicLoop` runs a callback at a periodic interval.
The loop can be stopped from the outside by using `stop()` and from the inside by returning `true`.

31
examples/GenericLoop.php Normal file
View File

@ -0,0 +1,31 @@
<?php declare(strict_types=1);
require 'vendor/autoload.php';
use danog\Loop\GenericLoop;
use function Amp\delay;
/** @var GenericLoop[] */
$loops = [];
for ($x = 0; $x < 10; $x++) {
$callable = function (GenericLoop $loop): float {
static $number = 0;
echo "$loop: $number".PHP_EOL;
$number++;
return $number < 10 ? 1.0 : GenericLoop::STOP;
};
$loop = new GenericLoop($callable, "Loop number $x");
$loop->start();
delay(0.1);
$loops []= $loop;
}
delay(5);
echo "Resuming prematurely all loops!".PHP_EOL;
foreach ($loops as $loop) {
$loop->resume();
}
echo "OK done, waiting 5 more seconds!".PHP_EOL;
delay(5);
echo "Closing all loops!".PHP_EOL;
delay(0.01);

47
examples/Loop.php Normal file
View File

@ -0,0 +1,47 @@
<?php declare(strict_types=1);
require 'vendor/autoload.php';
use danog\Loop\GenericLoop;
use danog\Loop\Loop;
use function Amp\delay;
class MyLoop extends Loop
{
private int $number = 0;
public function __construct(private string $name)
{
}
protected function loop(): ?float
{
echo "$this: {$this->number}".PHP_EOL;
$this->number++;
return $this->number < 10 ? 1.0 : GenericLoop::STOP;
}
public function __toString(): string
{
return $this->name;
}
}
/** @var MyLoop[] */
$loops = [];
for ($x = 0; $x < 10; $x++) {
$loop = new MyLoop("Loop number $x");
$loop->start();
delay(0.1);
$loops []= $loop;
}
delay(5);
echo "Resuming prematurely all loops!".PHP_EOL;
foreach ($loops as $loop) {
$loop->resume();
}
echo "OK done, waiting 5 more seconds!".PHP_EOL;
delay(5);
echo "Closing all loops!".PHP_EOL;
delay(0.01);

31
examples/PeriodicLoop.php Normal file
View File

@ -0,0 +1,31 @@
<?php declare(strict_types=1);
require 'vendor/autoload.php';
use danog\Loop\PeriodicLoop;
use function Amp\delay;
/** @var PeriodicLoop[] */
$loops = [];
for ($x = 0; $x < 10; $x++) {
$callable = function (PeriodicLoop $loop): bool {
static $number = 0;
echo "$loop: $number".PHP_EOL;
$number++;
return $number == 10;
};
$loop = new PeriodicLoop($callable, "Loop number $x", 1.0);
$loop->start();
delay(0.1);
$loops []= $loop;
}
delay(5);
echo "Resuming prematurely all loops!".PHP_EOL;
foreach ($loops as $loop) {
$loop->resume();
}
echo "OK done, waiting 5 more seconds!".PHP_EOL;
delay(5);
echo "Closing all loops!".PHP_EOL;
delay(0.01);

59
lib/GenericLoop.php Normal file
View File

@ -0,0 +1,59 @@
<?php declare(strict_types=1);
/**
* Generic loop.
*
* @author Daniil Gentili <daniil@daniil.it>
* @copyright 2016-2020 Daniil Gentili <daniil@daniil.it>
* @license https://opensource.org/licenses/MIT MIT
*/
namespace danog\Loop;
/**
* Generic loop, runs single callable.
*
* @author Daniil Gentili <daniil@daniil.it>
*/
class GenericLoop extends Loop
{
/**
* Callable.
*
* @var callable(static):?float
*/
private $callable;
/**
* Constructor.
*
* The return value of the callable can be:
* * A number - the loop will be paused for the specified number of seconds
* * GenericLoop::STOP - The loop will stop
* * GenericLoop::PAUSE - The loop will pause forever (or until loop is `resumed()`
* from outside the loop)
* * GenericLoop::CONTINUE - Return this if you want to rerun the loop immediately
*
* If the callable does not return anything,
* the loop will behave is if GenericLoop::PAUSE was returned.
*
* The callable will be passed the instance of the current loop.
*
* The loop can be stopped from the outside by using stop().
*
* @param callable(static):?float $callable Callable to run
* @param string $name Loop name
*/
public function __construct(callable $callable, private string $name)
{
$this->callable = $callable;
}
protected function loop(): ?float
{
return ($this->callable)($this);
}
public function __toString(): string
{
return $this->name;
}
}

44
lib/PeriodicLoop.php Normal file
View File

@ -0,0 +1,44 @@
<?php declare(strict_types=1);
/**
* Periodic loop.
*
* @author Daniil Gentili <daniil@daniil.it>
* @copyright 2016-2020 Daniil Gentili <daniil@daniil.it>
* @license https://opensource.org/licenses/MIT MIT
*/
namespace danog\Loop;
/**
* Periodic loop.
*
* @author Daniil Gentili <daniil@daniil.it>
*/
class PeriodicLoop extends GenericLoop
{
/**
* Constructor.
*
* Runs a callback at a periodic interval.
*
* The callable will be passed the instance of the current loop.
*
* The loop can be stopped from the outside by calling stop()
* and from the inside by returning `true`.
*
* @param callable(static):bool $callback Callable to run
* @param string $name Loop name
* @param ?float $interval Loop interval; if null, pauses indefinitely or until `resume()` is called.
*/
public function __construct(callable $callback, string $name, ?float $interval)
{
/** @psalm-suppress ArgumentTypeCoercion */
parent::__construct(static function (self $loop) use ($callback, $interval): ?float {
/** @psalm-suppress ArgumentTypeCoercion */
if ($callback($loop) === true) {
return GenericLoop::STOP;
}
return $interval;
}, $name);
}
}