Skip to content

Commit da29d5c

Browse files
committed
[Platform] Add IteratorAggregate to MessageBag
Allow iterating over MessageBag using foreach by implementing IteratorAggregate interface with ArrayIterator.
1 parent d61bbc3 commit da29d5c

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

src/platform/src/Message/MessageBag.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@
1515

1616
/**
1717
* @author Christopher Hertel <mail@christopher-hertel.de>
18+
*
19+
* @implements \IteratorAggregate<int, MessageInterface>
1820
*/
19-
class MessageBag implements \Countable
21+
class MessageBag implements \Countable, \IteratorAggregate
2022
{
2123
use MetadataAwareTrait;
2224

@@ -126,4 +128,12 @@ public function count(): int
126128
{
127129
return \count($this->messages);
128130
}
131+
132+
/**
133+
* @return \ArrayIterator<int, MessageInterface>
134+
*/
135+
public function getIterator(): \ArrayIterator
136+
{
137+
return new \ArrayIterator($this->messages);
138+
}
129139
}

src/platform/tests/Message/MessageBagTest.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,4 +262,42 @@ public function testGetUserMessageTextIgnoresNonTextContent()
262262
// Should only return the text content, ignoring the image
263263
$this->assertSame('Text content', $userText);
264264
}
265+
266+
public function testGetIterator()
267+
{
268+
$systemMessage = Message::forSystem('My amazing system prompt.');
269+
$assistantMessage = Message::ofAssistant('It is time to sleep.');
270+
$userMessage = Message::ofUser('Hello, world!');
271+
272+
$messageBag = new MessageBag($systemMessage, $assistantMessage, $userMessage);
273+
274+
$iterator = $messageBag->getIterator();
275+
276+
$this->assertInstanceOf(\ArrayIterator::class, $iterator);
277+
$this->assertCount(3, $iterator);
278+
279+
$messages = iterator_to_array($iterator);
280+
$this->assertSame($systemMessage, $messages[0]);
281+
$this->assertSame($assistantMessage, $messages[1]);
282+
$this->assertSame($userMessage, $messages[2]);
283+
}
284+
285+
public function testMessageBagIsIterable()
286+
{
287+
$systemMessage = Message::forSystem('My amazing system prompt.');
288+
$assistantMessage = Message::ofAssistant('It is time to sleep.');
289+
$userMessage = Message::ofUser('Hello, world!');
290+
291+
$messageBag = new MessageBag($systemMessage, $assistantMessage, $userMessage);
292+
293+
$collectedMessages = [];
294+
foreach ($messageBag as $index => $message) {
295+
$collectedMessages[$index] = $message;
296+
}
297+
298+
$this->assertCount(3, $collectedMessages);
299+
$this->assertSame($systemMessage, $collectedMessages[0]);
300+
$this->assertSame($assistantMessage, $collectedMessages[1]);
301+
$this->assertSame($userMessage, $collectedMessages[2]);
302+
}
265303
}

0 commit comments

Comments
 (0)