use agentkit_loop::{AgentEvent, LoopObserver};
pub struct BufferedReporter<T: LoopObserver> {
inner: T,
buffer: Vec<AgentEvent>,
capacity: usize,
}
impl<T: LoopObserver> BufferedReporter<T> {
pub fn new(inner: T, capacity: usize) -> Self {
Self {
inner,
buffer: Vec::with_capacity(capacity),
capacity,
}
}
pub fn flush(&mut self) {
for event in self.buffer.drain(..) {
self.inner.handle_event(event);
}
}
pub fn pending(&self) -> usize {
self.buffer.len()
}
pub fn inner(&self) -> &T {
&self.inner
}
pub fn inner_mut(&mut self) -> &mut T {
&mut self.inner
}
}
impl<T: LoopObserver> LoopObserver for BufferedReporter<T> {
fn handle_event(&mut self, event: AgentEvent) {
self.buffer.push(event);
if self.capacity > 0 && self.buffer.len() >= self.capacity {
self.flush();
}
}
}
impl<T: LoopObserver> Drop for BufferedReporter<T> {
fn drop(&mut self) {
self.flush();
}
}