use std::sync::Arc;
use tokio::sync::Mutex;
use slab::Slab;
pub type IdBuilder = Arc<Mutex<TaskIdGenerator>>;
#[repr(transparent)]
#[derive(PartialEq, Eq, Hash)]
pub struct TaskId(AcknowledgeId);
pub type AcknowledgeId = u32;
impl TaskId {
pub fn acknowledge_id(&self) -> AcknowledgeId { self.0 }
pub (crate) fn new(a: AcknowledgeId) -> Self { Self(a) }
}
#[derive(Clone)]
pub struct TaskIdGenerator(Slab<()>);
impl TaskIdGenerator {
pub(crate) fn new() -> IdBuilder { Arc::new(Mutex::new(Self(Slab::new()))) }
pub fn generate(&mut self) -> TaskId { TaskId::new(self.0.insert(()) as AcknowledgeId) }
pub(crate) fn delete(&mut self, TaskId(id): TaskId) -> Result<(),String> {
if self.0.try_remove(id as usize).is_none() { Err("TaskId: deleting a free identifier".to_string()) } else { Ok(()) }
}
}