diff --git a/src/StringStream.php b/src/StringStream.php index 8737997..85134e2 100644 --- a/src/StringStream.php +++ b/src/StringStream.php @@ -21,14 +21,20 @@ final class StringStream implements Stream { private string $string; private Position $position; + private bool $containsMultiBytes; /** * @api */ - public function __construct(string $string, ?Position $position = null) + public function __construct(string $string, ?Position $position = null, bool $containsMultiBytes = null) { $this->string = $string; $this->position = $position ?? Position::initial(); + if (null === $containsMultiBytes) { + $this->containsMultiBytes = \mb_strlen($string) != \strlen($string); + } else { + $this->containsMultiBytes = $containsMultiBytes; + } } /** @@ -39,12 +45,22 @@ public function take1(): TakeResult { $this->guardEndOfStream(); - $token = mb_substr($this->string, 0, 1); + if ($this->containsMultiBytes) { + $token = \mb_substr($this->string, 0, 1); + } else { + $token = \substr($this->string, 0, 1); + } $position = $this->position->advance($token); + if ($this->containsMultiBytes) { + $remainder = \mb_substr($this->string, 1); + } else { + $remainder = \substr($this->string, 1); + } + return new TakeResult( $token, - new StringStream(mb_substr($this->string, 1), $position) + new StringStream($remainder, $position, $this->containsMultiBytes) ); }