From da29d5c0690afb195a58480a846651f6109f5360 Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Sat, 29 Nov 2025 10:56:44 +0100 Subject: [PATCH] [Platform] Add IteratorAggregate to MessageBag Allow iterating over MessageBag using foreach by implementing IteratorAggregate interface with ArrayIterator. --- src/platform/src/Message/MessageBag.php | 12 +++++- src/platform/tests/Message/MessageBagTest.php | 38 +++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/platform/src/Message/MessageBag.php b/src/platform/src/Message/MessageBag.php index c480f107f..4c82673a9 100644 --- a/src/platform/src/Message/MessageBag.php +++ b/src/platform/src/Message/MessageBag.php @@ -15,8 +15,10 @@ /** * @author Christopher Hertel + * + * @implements \IteratorAggregate */ -class MessageBag implements \Countable +class MessageBag implements \Countable, \IteratorAggregate { use MetadataAwareTrait; @@ -126,4 +128,12 @@ public function count(): int { return \count($this->messages); } + + /** + * @return \ArrayIterator + */ + public function getIterator(): \ArrayIterator + { + return new \ArrayIterator($this->messages); + } } diff --git a/src/platform/tests/Message/MessageBagTest.php b/src/platform/tests/Message/MessageBagTest.php index cbe88e179..48c1e856c 100644 --- a/src/platform/tests/Message/MessageBagTest.php +++ b/src/platform/tests/Message/MessageBagTest.php @@ -262,4 +262,42 @@ public function testGetUserMessageTextIgnoresNonTextContent() // Should only return the text content, ignoring the image $this->assertSame('Text content', $userText); } + + public function testGetIterator() + { + $systemMessage = Message::forSystem('My amazing system prompt.'); + $assistantMessage = Message::ofAssistant('It is time to sleep.'); + $userMessage = Message::ofUser('Hello, world!'); + + $messageBag = new MessageBag($systemMessage, $assistantMessage, $userMessage); + + $iterator = $messageBag->getIterator(); + + $this->assertInstanceOf(\ArrayIterator::class, $iterator); + $this->assertCount(3, $iterator); + + $messages = iterator_to_array($iterator); + $this->assertSame($systemMessage, $messages[0]); + $this->assertSame($assistantMessage, $messages[1]); + $this->assertSame($userMessage, $messages[2]); + } + + public function testMessageBagIsIterable() + { + $systemMessage = Message::forSystem('My amazing system prompt.'); + $assistantMessage = Message::ofAssistant('It is time to sleep.'); + $userMessage = Message::ofUser('Hello, world!'); + + $messageBag = new MessageBag($systemMessage, $assistantMessage, $userMessage); + + $collectedMessages = []; + foreach ($messageBag as $index => $message) { + $collectedMessages[$index] = $message; + } + + $this->assertCount(3, $collectedMessages); + $this->assertSame($systemMessage, $collectedMessages[0]); + $this->assertSame($assistantMessage, $collectedMessages[1]); + $this->assertSame($userMessage, $collectedMessages[2]); + } }