Skip to content

Commit 2186ae2

Browse files
committed
feature #1024 [Platform] Add IteratorAggregate to MessageBag (OskarStark)
This PR was merged into the main branch. Discussion ---------- [Platform] Add `IteratorAggregate` to `MessageBag` | Q | A | ------------- | --- | Bug fix? | no | New feature? | yes | Docs? | no | Issues | -- | License | MIT Allow iterating over MessageBag using foreach by implementing IteratorAggregate interface with ArrayIterator. Extracted from * #1020 cc `@lochmueller` Commits ------- da29d5c [Platform] Add IteratorAggregate to MessageBag
2 parents 42345d3 + da29d5c commit 2186ae2

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)