Skip to main content

codetether_rlm/context_trace/
trace_events.rs

1use super::trace::MAX_EVENTS;
2use super::{ContextEvent, ContextTrace};
3use std::collections::VecDeque;
4
5impl ContextTrace {
6    /// Log a context event.
7    pub fn log_event(&mut self, event: ContextEvent) {
8        self.total_tokens += event.tokens();
9        self.evict_old_events();
10        self.events.push_back(event);
11    }
12
13    fn evict_old_events(&mut self) {
14        while self.events.len() >= MAX_EVENTS {
15            if let Some(evicted) = self.events.pop_front() {
16                self.total_tokens = self.total_tokens.saturating_sub(evicted.tokens());
17            }
18        }
19    }
20
21    /// Get all events.
22    pub fn events(&self) -> &VecDeque<ContextEvent> {
23        &self.events
24    }
25
26    /// Get events by type.
27    pub fn events_of_type(&self, label: &str) -> Vec<&ContextEvent> {
28        self.events
29            .iter()
30            .filter(|event| event.label() == label)
31            .collect()
32    }
33}