reactphp-input-stream/examples/classes.php

100 lines
2.4 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
use Toalett\React\Stream\EndlessTrait;
use Toalett\React\Stream\Source;
final class WillThrowExceptionAfter4Seconds implements Source
{
use EndlessTrait;
private const EMISSION_INTERVAL = 1.0;
private const SECONDS_BEFORE_EMITTING_ERROR = 4.0;
private float $lastEmission = 0;
private float $openedAt = 0;
public function open(): void
{
$this->openedAt = microtime(true);
}
public function select(): ?float
{
$now = microtime(true);
if ($now - $this->openedAt > self::SECONDS_BEFORE_EMITTING_ERROR) {
throw new RuntimeException('An error has occured!');
}
if ($now - $this->lastEmission > self::EMISSION_INTERVAL) {
$this->lastEmission = $now;
return $now;
}
return null;
}
}
final class Joker implements Source
{
use EndlessTrait;
private float $deadline = 0;
private array $jokes = [
'What did the Buddhist ask the hot dog vendor? - Make me one with everything.',
'You know why you never see elephants hiding up in trees? - Because theyre really good at it.',
'What is red and smells like blue paint? - Red paint.',
'A dyslexic man walks into a bra.',
'Where does the General keep his armies? - In his sleevies!',
'What do you call bears with no ears? - B',
'Why dont blind people skydive? - Because it scares the crap out of their dogs.',
];
public function open(): void
{
$this->scheduleNextJoke();
}
public function select(): ?string
{
if (microtime(true) < $this->deadline) {
return null;
}
$this->scheduleNextJoke();
return $this->jokes[array_rand($this->jokes)];
}
private function scheduleNextJoke(): void
{
$delay = mt_rand() / mt_getrandmax(); // somewhere between 0 - 1
$this->deadline = microtime(true) + (5.0 * $delay);
}
}
final class ReachesEofIn5Iterations implements Source
{
private array $buffer = [
'line 1',
'line 2',
'line 3',
'line 4',
'line 5',
];
public function open(): void
{
}
public function select(): ?string
{
return array_shift($this->buffer);
}
public function close(): void
{
}
public function eof(): bool
{
return count($this->buffer) === 0;
}
}