use crate::communication::Push;
pub mod pushers;
pub mod pullers;
pub mod pact;
pub type Bundle<T, D> = crate::communication::Message<Message<T, D>>;
#[derive(Clone, Abomonation, Serialize, Deserialize)]
pub struct Message<T, D> {
pub time: T,
pub data: Vec<D>,
pub from: usize,
pub seq: usize,
}
impl<T, D> Message<T, D> {
pub fn default_length() -> usize {
1024
}
pub fn new(time: T, data: Vec<D>, from: usize, seq: usize) -> Self {
Message { time, data, from, seq }
}
#[inline(always)]
pub fn push_at<P: Push<Bundle<T, D>>>(buffer: &mut Vec<D>, time: T, pusher: &mut P) {
let data = ::std::mem::replace(buffer, Vec::new());
let message = Message::new(time, data, 0, 0);
let mut bundle = Some(Bundle::from_typed(message));
pusher.push(&mut bundle);
if let Some(message) = bundle {
if let Some(message) = message.if_typed() {
*buffer = message.data;
buffer.clear();
}
}
if buffer.capacity() != Self::default_length() {
*buffer = Vec::with_capacity(Self::default_length());
}
}}