-
-
Notifications
You must be signed in to change notification settings - Fork 76
/
Copy pathnotification.rs
47 lines (39 loc) · 1.57 KB
/
notification.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//! Common data types for notifications.
#[cfg(feature = "sync")]
pub(crate) mod notifier;
use std::{future::Future, pin::Pin, sync::Arc};
/// A future returned by an eviction listener.
///
/// You can use the [`boxed` method][boxed-method] of `FutureExt` trait to convert a
/// regular `Future` object into `ListenerFuture`.
///
/// [boxed-method]: ../future/trait.FutureExt.html#method.boxed
pub type ListenerFuture = Pin<Box<dyn Future<Output = ()> + Send>>;
#[cfg(feature = "sync")]
pub(crate) type EvictionListener<K, V> =
Arc<dyn Fn(Arc<K>, V, RemovalCause) + Send + Sync + 'static>;
#[cfg(feature = "future")]
pub(crate) type AsyncEvictionListener<K, V> =
Box<dyn Fn(Arc<K>, V, RemovalCause) -> ListenerFuture + Send + Sync + 'static>;
// NOTE: Currently, dropping the cache will drop all entries without sending
// notifications. Calling `invalidate_all` method of the cache will trigger
// the notifications, but currently there is no way to know when all entries
// have been invalidated and their notifications have been sent.
/// Indicates the reason why a cached entry was removed.
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum RemovalCause {
/// The entry's expiration timestamp has passed.
Expired,
/// The entry was manually removed by the user.
Explicit,
/// The entry itself was not actually removed, but its value was replaced by
/// the user.
Replaced,
/// The entry was evicted due to size constraints.
Size,
}
impl RemovalCause {
pub fn was_evicted(&self) -> bool {
matches!(self, Self::Expired | Self::Size)
}
}