sigwake 0.0.1

A thread-safe signal-based state management library that integrates with Rust's async programming model
Documentation
use std::mem;

use derive_ex::Ex;

use crate::utils::inf_vec::InfVec;

#[derive(Debug, Clone, Ex)]
#[derive_ex(Default)]
#[default(Self::new())]
pub struct USizeSet {
    bitmap: InfVec<bool>,
    values: Vec<usize>,
}
impl USizeSet {
    pub fn new() -> Self {
        Self {
            bitmap: InfVec::new(),
            values: Vec::new(),
        }
    }
    pub fn insert(&mut self, value: usize) {
        if !mem::replace(&mut self.bitmap[value], true) {
            self.values.push(value);
        }
    }
    pub fn clear(&mut self) {
        self.values.clear();
        self.bitmap.clear();
    }
    pub fn iter(&self) -> USizeSetIter<'_> {
        self.into_iter()
    }
}

impl<'a> IntoIterator for &'a USizeSet {
    type Item = usize;
    type IntoIter = USizeSetIter<'a>;
    fn into_iter(self) -> Self::IntoIter {
        USizeSetIter {
            source: self,
            index: 0,
        }
    }
}

pub struct USizeSetIter<'a> {
    source: &'a USizeSet,
    index: usize,
}
impl Iterator for USizeSetIter<'_> {
    type Item = usize;
    fn next(&mut self) -> Option<Self::Item> {
        let value = *self.source.values.get(self.index)?;
        self.index += 1;
        Some(value)
    }
}