use super::{ActionRecord, DependencyGraphRecord, LlmCallRecord, Record};
pub struct RecordStream<'a> {
records: &'a [Record],
}
impl<'a> RecordStream<'a> {
pub fn new(records: &'a [Record]) -> Self {
Self { records }
}
pub fn actions(&self) -> impl Iterator<Item = &ActionRecord> {
self.records.iter().filter_map(Record::as_action)
}
pub fn llm_calls(&self) -> impl Iterator<Item = &LlmCallRecord> {
self.records.iter().filter_map(Record::as_llm)
}
pub fn dependency_graphs(&self) -> impl Iterator<Item = &DependencyGraphRecord> {
self.records.iter().filter_map(Record::as_dependency_graph)
}
pub fn by_worker(&self, worker_id: usize) -> impl Iterator<Item = &Record> {
self.records
.iter()
.filter(move |r| r.worker_id() == Some(worker_id))
}
pub fn group_by_worker(&self) -> std::collections::HashMap<usize, Vec<&Record>> {
let mut groups = std::collections::HashMap::new();
for record in self.records {
if let Some(worker_id) = record.worker_id() {
groups
.entry(worker_id)
.or_insert_with(Vec::new)
.push(record);
}
}
groups
}
pub fn sorted_by_time(&self) -> Vec<&Record> {
let mut sorted: Vec<_> = self.records.iter().collect();
sorted.sort_by_key(|r| r.timestamp_ms());
sorted
}
pub fn len(&self) -> usize {
self.records.len()
}
pub fn is_empty(&self) -> bool {
self.records.is_empty()
}
}