/** * {@inheritdoc} */ public function read(int $length = 0, string $byte = null, float $timeout = 0) : \Generator { if (!$this->isReadable()) { throw new UnreadableException('The stream is no longer readable.'); } if (0 > $length) { throw new InvalidArgumentError('The length should be a positive integer.'); } $byte = strlen($byte) ? $byte[0] : null; if (null !== $byte) { $data = ''; $i = 0; do { $char = $this->iterator->current(); $this->iterator->next(); $data .= $char; } while ($char !== $byte && (0 === $length || ++$i < $length) && $this->iterator->valid()); return $data; } if (0 === $length) { $length = $this->buffer->getLength(); } $position = $this->iterator->key(); $data = $this->buffer->peek($length, $position); $position = $length + $position; if ($position > $this->buffer->getLength()) { $position = $this->buffer->getLength(); } $this->iterator->seek($position); return $data; yield; // Unreachable, but makes the method a coroutine. }