[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 * @return static
*/ */
abstract public function join(array $strings): self; abstract public function join(array $strings, string $lastGlue = null): self;
public function jsonSerialize(): string public function jsonSerialize(): string
{ {

View File

@ -180,10 +180,12 @@ abstract class AbstractUnicodeString extends AbstractString
return $str; return $str;
} }
public function join(array $strings): parent public function join(array $strings, string $lastGlue = null): parent
{ {
$str = clone $this; $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)) { if (!preg_match('//u', $str->string)) {
throw new InvalidArgumentException('Invalid UTF-8 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); 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 = 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; return $str;
} }

View File

@ -1160,6 +1160,11 @@ abstract class AbstractAsciiTestCase extends TestCase
$this->assertEquals(static::createFromString($expected), $instance); $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() public static function provideJoin()
{ {
return [ return [

View File

@ -178,9 +178,9 @@ class UnicodeString extends AbstractUnicodeString
return false === $i ? null : $i; 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); normalizer_is_normalized($str->string) ?: $str->string = normalizer_normalize($str->string);
return $str; return $str;