50 lines
1001 B
Go
50 lines
1001 B
Go
package teachingassets
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"tutor/internal/workflows"
|
|
)
|
|
|
|
type Store interface {
|
|
SavePrompt(PromptCandidate) (PromptCandidate, error)
|
|
Snapshot() Snapshot
|
|
}
|
|
|
|
type MemoryStore struct {
|
|
mu sync.RWMutex
|
|
prompts []PromptCandidate
|
|
}
|
|
|
|
func NewMemoryStore() *MemoryStore {
|
|
return &MemoryStore{}
|
|
}
|
|
|
|
func (s *MemoryStore) SavePrompt(prompt PromptCandidate) (PromptCandidate, error) {
|
|
s.mu.Lock()
|
|
defer s.mu.Unlock()
|
|
|
|
s.prompts = append(s.prompts, clonePrompt(prompt))
|
|
return prompt, nil
|
|
}
|
|
|
|
func (s *MemoryStore) Snapshot() Snapshot {
|
|
s.mu.RLock()
|
|
defer s.mu.RUnlock()
|
|
|
|
return Snapshot{Prompts: clonePrompts(s.prompts)}
|
|
}
|
|
|
|
func clonePrompts(items []PromptCandidate) []PromptCandidate {
|
|
cloned := make([]PromptCandidate, len(items))
|
|
for i, item := range items {
|
|
cloned[i] = clonePrompt(item)
|
|
}
|
|
return cloned
|
|
}
|
|
|
|
func clonePrompt(prompt PromptCandidate) PromptCandidate {
|
|
prompt.SourceEvidence = append([]workflows.EvidenceRef(nil), prompt.SourceEvidence...)
|
|
return prompt
|
|
}
|