From 7d5cd565593fc0d2802f842a31334dd3ad029ed3 Mon Sep 17 00:00:00 2001 From: Timm Friebe Date: Sat, 27 Sep 2025 22:44:49 +0200 Subject: [PATCH 1/3] Add `concat()`, returns a concatenation of the sequence and the given enumerable --- src/main/php/util/data/Sequence.class.php | 16 ++++++++++++++++ .../data/unittest/SequenceCreationTest.class.php | 13 +++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/main/php/util/data/Sequence.class.php b/src/main/php/util/data/Sequence.class.php index e507702..2f57e83 100755 --- a/src/main/php/util/data/Sequence.class.php +++ b/src/main/php/util/data/Sequence.class.php @@ -95,6 +95,22 @@ public static function generate($supplier) { return new self($f()); } + /** + * Creates a new stream with an enumeration of elements + * + * @param ?iterable|util.XPIterator|function(): iterable $enumerable + * @return self + * @throws lang.IllegalArgumentException if type of elements argument is incorrect + */ + public function concat($enumerable) { + $enumeration= Enumeration::of($enumerable); + $f= function() use($enumeration) { + yield from $this->elements; + yield from $enumeration; + }; + return new self($f()); + } + /** * Returns the first element of this stream, or an empty optional * diff --git a/src/test/php/util/data/unittest/SequenceCreationTest.class.php b/src/test/php/util/data/unittest/SequenceCreationTest.class.php index a1ff425..76deb69 100755 --- a/src/test/php/util/data/unittest/SequenceCreationTest.class.php +++ b/src/test/php/util/data/unittest/SequenceCreationTest.class.php @@ -73,4 +73,17 @@ public function passing_sequence_to_of_yields_itself() { public function multiple_arguments_supported_in_of(... $input) { $this->assertSequence([1, 2, 3, 4, 5, 6], Sequence::of(...$input)); } + + #[Test] + public function concat() { + $this->assertSequence( + [1, 2, 3, 4, 5, 6, 7, 8, 9], + Sequence::of([1, 2, 3])->concat([4, 5, 6])->concat([7, 8, 9]) + ); + } + + #[Test, Expect(IllegalArgumentException::class)] + public function cannot_concat_non_enumerable() { + Sequence::$EMPTY->concat('test'); + } } \ No newline at end of file From eb5a14b522ecdbafa7c1e7b7257b0aded92d8d8a Mon Sep 17 00:00:00 2001 From: Timm Friebe Date: Sat, 27 Sep 2025 22:47:51 +0200 Subject: [PATCH 2/3] Add test for concat() after map() --- .../php/util/data/unittest/SequenceCreationTest.class.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/test/php/util/data/unittest/SequenceCreationTest.class.php b/src/test/php/util/data/unittest/SequenceCreationTest.class.php index 76deb69..50f3a4e 100755 --- a/src/test/php/util/data/unittest/SequenceCreationTest.class.php +++ b/src/test/php/util/data/unittest/SequenceCreationTest.class.php @@ -82,6 +82,14 @@ public function concat() { ); } + #[Test] + public function concat_after_mapping() { + $this->assertSequence( + [2, 4, 6, 'EOF'], + Sequence::of([1, 2, 3])->map(fn($e) => $e * 2)->concat(['EOF']) + ); + } + #[Test, Expect(IllegalArgumentException::class)] public function cannot_concat_non_enumerable() { Sequence::$EMPTY->concat('test'); From 427b349b9631b86d840aba42603c389154959dd0 Mon Sep 17 00:00:00 2001 From: Timm Friebe Date: Sat, 27 Sep 2025 22:48:54 +0200 Subject: [PATCH 3/3] Fix PHP < 7.4 --- src/test/php/util/data/unittest/SequenceCreationTest.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/php/util/data/unittest/SequenceCreationTest.class.php b/src/test/php/util/data/unittest/SequenceCreationTest.class.php index 50f3a4e..35df00d 100755 --- a/src/test/php/util/data/unittest/SequenceCreationTest.class.php +++ b/src/test/php/util/data/unittest/SequenceCreationTest.class.php @@ -86,7 +86,7 @@ public function concat() { public function concat_after_mapping() { $this->assertSequence( [2, 4, 6, 'EOF'], - Sequence::of([1, 2, 3])->map(fn($e) => $e * 2)->concat(['EOF']) + Sequence::of([1, 2, 3])->map(function($e) { return $e * 2; })->concat(['EOF']) ); }