<?php namespace WP_Ultimo\Dependencies\Amp\ByteStream; use WP_Ultimo\Dependencies\Amp\Promise; use function WP_Ultimo\Dependencies\Amp\call; final class LineReader { /** @var string */ private $delimiter; /** @var bool */ private $lineMode; /** @var string */ private $buffer = ""; /** @var InputStream */ private $source; public function __construct(InputStream $inputStream, string $delimiter = null) { $this->source = $inputStream; $this->delimiter = $delimiter === null ? "\n" : $delimiter; $this->lineMode = $delimiter === null; } /** * @return Promise<string|null> */ public function readLine() : Promise { return call(function () { if (\false !== \strpos($this->buffer, $this->delimiter)) { list($line, $this->buffer) = \explode($this->delimiter, $this->buffer, 2); return $this->lineMode ? \rtrim($line, "\r") : $line; } while (null !== ($chunk = (yield $this->source->read()))) { $this->buffer .= $chunk; if (\false !== \strpos($this->buffer, $this->delimiter)) { list($line, $this->buffer) = \explode($this->delimiter, $this->buffer, 2); return $this->lineMode ? \rtrim($line, "\r") : $line; } } if ($this->buffer === "") { return null; } $line = $this->buffer; $this->buffer = ""; return $this->lineMode ? \rtrim($line, "\r") : $line; }); } public function getBuffer() : string { return $this->buffer; } /** * @return void */ public function clearBuffer() { $this->buffer = ""; } }