use std::hash::Hash;
use super::limit::{AsyncLimit, SyncLimit};
use super::lockable_hash_map::LockableHashMap;
use super::lockable_trait::Lockable;
use super::utils::never::InfallibleUnwrap;
pub struct LockPool<K>
where
K: Eq + PartialEq + Hash + Clone,
{
map: LockableHashMap<K, ()>,
}
impl<K> Lockable<K, ()> for LockPool<K>
where
K: Eq + PartialEq + Hash + Clone,
{
type Guard<'a>
= <LockableHashMap<K, ()> as Lockable<K, ()>>::Guard<'a>
where
K: 'a;
type OwnedGuard = <LockableHashMap<K, ()> as Lockable<K, ()>>::OwnedGuard;
type SyncLimit<'a, OnEvictFn, E>
= <LockableHashMap<K, ()> as Lockable<K, ()>>::SyncLimit<'a, OnEvictFn, E>
where
OnEvictFn: FnMut(Vec<Self::Guard<'a>>) -> Result<(), E>,
K: 'a;
type SyncLimitOwned<OnEvictFn, E>
= <LockableHashMap<K, ()> as Lockable<K, ()>>::SyncLimitOwned<OnEvictFn, E>
where
OnEvictFn: FnMut(Vec<Self::OwnedGuard>) -> Result<(), E>;
type AsyncLimit<'a, OnEvictFn, E, F>
= <LockableHashMap<K, ()> as Lockable<K, ()>>::AsyncLimit<'a, OnEvictFn, E, F>
where
F: Future<Output = Result<(), E>>,
OnEvictFn: FnMut(Vec<Self::Guard<'a>>) -> F,
K: 'a;
type AsyncLimitOwned<OnEvictFn, E, F>
= <LockableHashMap<K, ()> as Lockable<K, ()>>::AsyncLimitOwned<OnEvictFn, E, F>
where
F: Future<Output = Result<(), E>>,
OnEvictFn: FnMut(Vec<Self::OwnedGuard>) -> F;
}
impl<K> LockPool<K>
where
K: Eq + PartialEq + Hash + Clone,
{
#[inline]
pub fn new() -> Self {
Self {
map: LockableHashMap::new(),
}
}
#[inline]
pub fn num_locked(&self) -> usize {
self.map.num_entries_or_locked()
}
#[inline]
pub fn blocking_lock(&self, key: K) -> <Self as Lockable<K, ()>>::Guard<'_> {
self.map
.blocking_lock(key, SyncLimit::no_limit())
.infallible_unwrap()
}
#[inline]
pub fn try_lock(&self, key: K) -> Option<<Self as Lockable<K, ()>>::Guard<'_>> {
self.map
.try_lock(key, SyncLimit::no_limit())
.infallible_unwrap()
}
#[inline]
pub async fn async_lock(&self, key: K) -> <Self as Lockable<K, ()>>::Guard<'_> {
self.map
.async_lock(key, AsyncLimit::no_limit())
.await
.infallible_unwrap()
}
#[inline]
pub fn locked_keys(&self) -> Vec<K> {
self.map.keys_with_entries_or_locked()
}
}
impl<K> Default for LockPool<K>
where
K: Eq + PartialEq + Hash + Clone,
{
fn default() -> Self {
Self::new()
}
}