quick_stream 0.1.3

Quick Stream is a Rust-based solution designed to efficiently handle data upsert operations with a focus on performance and scalability. Utilizing asynchronous programming and a dynamic sender-receiver model, Quick Stream aims to streamline the process of synchronizing large datasets with minimal overhead.
Documentation
use std::collections::HashMap;

use crate::remove_upsert_duplicates;

use super::MultiTableUpsert;

#[derive(Debug, Clone)]
pub struct DataHolder<T> where T: MultiTableUpsert<T> + Send + Clone {
    data: HashMap<String, Vec<T>>
}

impl<T> Default for DataHolder<T> where T: MultiTableUpsert<T> + Send + Clone {
    fn default() -> Self {
        let mut data = HashMap::with_capacity(T::tables().len());
        for table_name in T::tables() {
            data.insert(table_name.to_string(), Vec::new());
        }
        DataHolder { data}
    }
}

impl<T> DataHolder<T> where T: MultiTableUpsert<T> + Send + Clone + 'static {
    fn add(&mut self, datam: T) {
        let table_name = datam.table();
        self.data.get_mut(&table_name).unwrap().push(datam);
    }

    pub fn add_all(&mut self, data: Vec<T>, limit: usize) -> HashMap<String, Vec<T>>{
        for datam in data {
            self.add(datam);
        };

        self.remove_duplicates();
        self.get_over_limit(limit)
    }

    pub fn remove_duplicates(&mut self) {
        for (_, data) in self.data.iter_mut() {
            remove_upsert_duplicates(data);
        }
    }

    pub fn len(&self) -> usize {
        self.data.len()
    }

    pub fn get_over_limit(&mut self, limit: usize) -> HashMap<String, Vec<T>> {

        let mut cloned_data = self.data.to_owned();
        self.data.retain(|_, x| x.len() < limit);
        cloned_data.retain(|_, y| y.len() >= limit);

        cloned_data
    }

    pub fn get_all(&self) -> HashMap<String, Vec<T>> {
        self.data.to_owned()
    }
}