45 lines
1.2 KiB
PHP
45 lines
1.2 KiB
PHP
<?php
|
|
|
|
namespace WP_Ultimo\Dependencies\Amp\ByteStream;
|
|
|
|
use WP_Ultimo\Dependencies\Amp\Promise;
|
|
use WP_Ultimo\Dependencies\Amp\Success;
|
|
use function WP_Ultimo\Dependencies\Amp\call;
|
|
final class InputStreamChain implements InputStream
|
|
{
|
|
/** @var InputStream[] */
|
|
private $streams;
|
|
/** @var bool */
|
|
private $reading = \false;
|
|
public function __construct(InputStream ...$streams)
|
|
{
|
|
$this->streams = $streams;
|
|
}
|
|
/** @inheritDoc */
|
|
public function read() : Promise
|
|
{
|
|
if ($this->reading) {
|
|
throw new PendingReadError();
|
|
}
|
|
if (!$this->streams) {
|
|
return new Success(null);
|
|
}
|
|
return call(function () {
|
|
$this->reading = \true;
|
|
try {
|
|
while ($this->streams) {
|
|
$chunk = (yield $this->streams[0]->read());
|
|
if ($chunk === null) {
|
|
\array_shift($this->streams);
|
|
continue;
|
|
}
|
|
return $chunk;
|
|
}
|
|
return null;
|
|
} finally {
|
|
$this->reading = \false;
|
|
}
|
|
});
|
|
}
|
|
}
|