use std::collections::HashMap;
use bitfold_core::shared::SharedBytes;
#[derive(Debug)]
pub struct ChannelState {
expected_sequence: u16,
buffered_packets: HashMap<u16, SharedBytes>,
latest_sequence: u16,
}
impl ChannelState {
pub fn new() -> Self {
Self { expected_sequence: 0, buffered_packets: HashMap::new(), latest_sequence: 0 }
}
pub fn process_ordered(&mut self, sequence: u16, data: SharedBytes) -> Vec<SharedBytes> {
let mut ready_packets = Vec::new();
self.buffered_packets.insert(sequence, data);
while let Some(packet_data) = self.buffered_packets.remove(&self.expected_sequence) {
ready_packets.push(packet_data);
self.expected_sequence = self.expected_sequence.wrapping_add(1);
}
ready_packets
}
pub fn process_sequenced(&mut self, sequence: u16, data: SharedBytes) -> Option<SharedBytes> {
let is_newer = sequence.wrapping_sub(self.latest_sequence) < 32768;
if is_newer || sequence == 0 {
self.latest_sequence = sequence;
Some(data)
} else {
None }
}
}