sigwake 0.0.1

A thread-safe signal-based state management library that integrates with Rust's async programming model
Documentation
use std::ops::{Index, IndexMut};

use derive_ex::Ex;

#[derive(Debug, Clone, Ex)]
#[derive_ex(Default(bound(T)))]
#[default(Self::new())]
pub struct InfVec<T> {
    items: Vec<T>,
    default_value: T,
}

impl<T: Default> InfVec<T> {
    pub fn new() -> Self {
        Self {
            items: Vec::new(),
            default_value: Default::default(),
        }
    }
    pub fn clear(&mut self) {
        self.items.clear();
    }
    pub fn iter(&self) -> impl Iterator<Item = &T> {
        self.items.iter()
    }
}
impl<T: Default> Index<usize> for InfVec<T> {
    type Output = T;
    fn index(&self, index: usize) -> &Self::Output {
        if let Some(item) = self.items.get(index) {
            item
        } else {
            &self.default_value
        }
    }
}
impl<T: Default> IndexMut<usize> for InfVec<T> {
    fn index_mut(&mut self, index: usize) -> &mut Self::Output {
        if self.items.len() <= index {
            self.items.resize_with(index + 1, || Default::default());
        }
        &mut self.items[index]
    }
}

impl<'a, T> IntoIterator for &'a InfVec<T> {
    type Item = &'a T;
    type IntoIter = std::slice::Iter<'a, T>;
    fn into_iter(self) -> Self::IntoIter {
        self.items.iter()
    }
}