use std::sync::Arc;
use async_trait::async_trait;
use synaptic_core::{MemoryStore, Message, SynapticError};
pub struct ConversationWindowMemory {
store: Arc<dyn MemoryStore>,
window_size: usize,
}
impl ConversationWindowMemory {
pub fn new(store: Arc<dyn MemoryStore>, window_size: usize) -> Self {
Self { store, window_size }
}
}
#[async_trait]
impl MemoryStore for ConversationWindowMemory {
async fn append(&self, session_id: &str, message: Message) -> Result<(), SynapticError> {
self.store.append(session_id, message).await
}
async fn load(&self, session_id: &str) -> Result<Vec<Message>, SynapticError> {
let messages = self.store.load(session_id).await?;
if messages.len() <= self.window_size {
Ok(messages)
} else {
let start = messages.len() - self.window_size;
Ok(messages[start..].to_vec())
}
}
async fn clear(&self, session_id: &str) -> Result<(), SynapticError> {
self.store.clear(session_id).await
}
}