use super::{SessionChunks, SlotChunk};
const SESSION_SLOT_GAP_THRESHOLD: u64 = 5_000;
pub(super) fn group_chunks_into_sessions(all_chunks: &[SlotChunk]) -> Vec<SessionChunks> {
let mut sessions: Vec<SessionChunks> = Vec::new();
let mut current: SessionChunks = Vec::new();
let mut terminator_seen = false;
for chunk in all_chunks {
let size = chunk.2.len();
let last = current.last();
let prev_size = last.map(|(_, _, data)| data.len());
let prev_slot = last.map(|(slot, _, _)| *slot);
let slot_gap_break = matches!(
prev_slot,
Some(prev) if chunk.0.saturating_sub(prev) > SESSION_SLOT_GAP_THRESHOLD
);
let start_new = slot_gap_break
|| match prev_size {
Some(prev) => terminator_seen || size > prev,
None => false,
};
if start_new {
sessions.push(std::mem::take(&mut current));
terminator_seen = false;
}
if let Some(prev) = prev_size {
if !start_new && size < prev {
terminator_seen = true;
}
}
current.push(chunk.clone());
}
if !current.is_empty() {
sessions.push(current);
}
sessions
}