1use std::{
13 collections::VecDeque,
14 ops::{Deref, DerefMut},
15 sync::{Condvar, Mutex},
16};
17
18pub struct Pool<T> {
20 items: Mutex<VecDeque<T>>,
21 value_returned: Condvar,
22}
23
24impl<T> Pool<T> {
25 pub fn new(items: impl IntoIterator<Item = T>) -> Self {
27 Pool {
28 items: Mutex::new(items.into_iter().collect()),
29 value_returned: Condvar::new(),
30 }
31 }
32
33 pub fn take(&self) -> Returnable<T> {
40 let mut lock = self.items.lock().unwrap();
41 loop {
42 if let Some(value) = lock.pop_front() {
43 return Returnable {
44 value: Some(value),
45 pool: self,
46 };
47 }
48 lock = self.value_returned.wait(lock).unwrap();
49 }
50 }
51
52 fn return_(&self, value: T) {
53 self.items.lock().unwrap().push_back(value);
54 }
55}
56
57pub struct Returnable<'p, T> {
61 value: Option<T>,
63 pool: &'p Pool<T>,
64}
65
66impl<'p, T> Drop for Returnable<'p, T> {
67 fn drop(&mut self) {
68 self.pool.return_(self.value.take().unwrap());
69 self.pool.value_returned.notify_one();
70 }
71}
72
73impl<'p, T> Deref for Returnable<'p, T> {
74 type Target = T;
75
76 fn deref(&self) -> &Self::Target {
77 self.value.as_ref().unwrap()
78 }
79}
80
81impl<'p, T> DerefMut for Returnable<'p, T> {
82 fn deref_mut(&mut self) -> &mut Self::Target {
83 self.value.as_mut().unwrap()
84 }
85}