Avoid intermediate conversation history copies
This commit is contained in:
@@ -51,10 +51,42 @@ func (e *Exchange) Messages() []RenderedMessage {
|
||||
if e == nil {
|
||||
return nil
|
||||
}
|
||||
messages := make([]RenderedMessage, e.count)
|
||||
for current := e; current != nil; current = current.parent {
|
||||
start := current.count - len(current.messages)
|
||||
copyRenderedMessages(messages[start:current.count], current.messages)
|
||||
return e.MessagesWithSuffix()
|
||||
}
|
||||
|
||||
// MessagesWithSuffix returns independently owned history followed by each part.
|
||||
// A nil exchange supplies no history.
|
||||
func (e *Exchange) MessagesWithSuffix(parts ...[]RenderedMessage) []RenderedMessage {
|
||||
count := e.MessageCount()
|
||||
for _, part := range parts {
|
||||
count += len(part)
|
||||
}
|
||||
messages := make([]RenderedMessage, count)
|
||||
e.visitChunks(func(start int, chunk []RenderedMessage) {
|
||||
copyRenderedMessages(messages[start:], chunk)
|
||||
})
|
||||
offset := e.MessageCount()
|
||||
for _, part := range parts {
|
||||
copyRenderedMessages(messages[offset:], part)
|
||||
offset += len(part)
|
||||
}
|
||||
return messages
|
||||
}
|
||||
|
||||
// VisitMessages visits indexed history entries without materializing a slice.
|
||||
// Entries and their cache metadata are borrowed read-only values. Visits need
|
||||
// not be in index order; callers can fill a destination using the supplied index.
|
||||
func (e *Exchange) VisitMessages(visit func(int, RenderedMessage)) {
|
||||
e.visitChunks(func(start int, chunk []RenderedMessage) {
|
||||
for index, message := range chunk {
|
||||
visit(start+index, message)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func (e *Exchange) visitChunks(visit func(int, []RenderedMessage)) {
|
||||
for current := e; current != nil; current = current.parent {
|
||||
start := current.count - len(current.messages)
|
||||
visit(start, current.messages)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user