34 lines
762 B
Rust
34 lines
762 B
Rust
use std::{
|
|
collections::VecDeque,
|
|
sync::{Arc, RwLock},
|
|
};
|
|
|
|
pub struct RotatingQueue<T> {
|
|
deque: Arc<RwLock<VecDeque<T>>>,
|
|
}
|
|
|
|
impl<T: Clone> RotatingQueue<T> {
|
|
pub fn new<F>(size: usize, creator_functor: F) -> Self
|
|
where
|
|
F: Fn() -> T,
|
|
{
|
|
let item = Self {
|
|
deque: Arc::new(RwLock::new(VecDeque::<T>::new())),
|
|
};
|
|
{
|
|
let mut deque = item.deque.write().unwrap();
|
|
for _i in 0..size {
|
|
deque.push_back(creator_functor());
|
|
}
|
|
}
|
|
item
|
|
}
|
|
|
|
pub fn get(&self) -> T {
|
|
let mut deque = self.deque.write().unwrap();
|
|
let current = deque.pop_front().unwrap();
|
|
deque.push_back(current.clone());
|
|
current
|
|
}
|
|
}
|