use std::sync::Mutex;
use super::IdProvider;
#[derive(Debug, Default)]
pub struct IdProviderMutex {
internal_counter: Mutex<u64>,
}
impl PartialEq for IdProviderMutex {
fn eq(&self, other: &Self) -> bool {
self.peek_next_id() == other.peek_next_id()
}
}
impl IdProviderMutex {
pub fn new(internal_counter: u64) -> Self {
Self {
internal_counter: Mutex::new(internal_counter),
}
}
}
impl Clone for IdProviderMutex {
fn clone(&self) -> Self {
Self {
internal_counter: Mutex::new(self.peek_next_id()),
}
}
}
impl IdProvider for IdProviderMutex {
fn next_id(&self) -> u64 {
let mut counter = self.internal_counter.lock().unwrap();
let value = *counter;
*counter += 1;
value
}
fn peek_next_id(&self) -> u64 {
*self.internal_counter.lock().unwrap()
}
}
#[cfg(test)]
mod tests {
use crate::id_provider::{IdProvider, id_provider_mutex::IdProviderMutex};
#[test]
fn peek_id_as_expected() {
let target = IdProviderMutex::new(5);
assert_eq!(5, target.peek_next_id());
assert_eq!(5, target.peek_next_id());
}
#[test]
fn gets_ids_as_expected() {
let target = IdProviderMutex::default();
assert_eq!(0, target.next_id());
assert_eq!(1, target.next_id());
}
}