[String] add $lastGlue argument to join() methods

This commit is contained in:
Nicolas Grekas 2019-10-08 17:49:00 +02:00
parent bb392bcbbe
commit 714d6290df
5 changed files with 16 additions and 7 deletions

View File

@ -387,7 +387,7 @@ abstract class AbstractString implements \JsonSerializable
/**
* @return static
*/
abstract public function join(array $strings): self;
abstract public function join(array $strings, string $lastGlue = null): self;
public function jsonSerialize(): string
{

View File

@ -180,10 +180,12 @@ abstract class AbstractUnicodeString extends AbstractString
return $str;
}
public function join(array $strings): parent
public function join(array $strings, string $lastGlue = null): parent
{
$str = clone $this;
$str->string = implode($this->string, $strings);
$tail = null !== $lastGlue && 1 < \count($strings) ? $lastGlue.array_pop($strings) : '';
$str->string = implode($this->string, $strings).$tail;
if (!preg_match('//u', $str->string)) {
throw new InvalidArgumentException('Invalid UTF-8 string.');

View File

@ -168,10 +168,12 @@ class ByteString extends AbstractString
return '' === $this->string || preg_match('//u', $this->string);
}
public function join(array $strings): parent
public function join(array $strings, string $lastGlue = null): parent
{
$str = clone $this;
$str->string = implode($str->string, $strings);
$tail = null !== $lastGlue && 1 < \count($strings) ? $lastGlue.array_pop($strings) : '';
$str->string = implode($this->string, $strings).$tail;
return $str;
}

View File

@ -1160,6 +1160,11 @@ abstract class AbstractAsciiTestCase extends TestCase
$this->assertEquals(static::createFromString($expected), $instance);
}
public function testJoinWithLastGlue()
{
$this->assertSame('foo, bar and baz', (string) static::createFromString(', ')->join(['foo', 'bar', 'baz'], ' and '));
}
public static function provideJoin()
{
return [

View File

@ -178,9 +178,9 @@ class UnicodeString extends AbstractUnicodeString
return false === $i ? null : $i;
}
public function join(array $strings): AbstractString
public function join(array $strings, string $lastGlue = null): AbstractString
{
$str = parent::join($strings);
$str = parent::join($strings, $lastGlue);
normalizer_is_normalized($str->string) ?: $str->string = normalizer_normalize($str->string);
return $str;