use core::time::Duration;
pub const DEFAULT_MAX_KEYS: usize = 1 << 20;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Eviction {
max_keys: Option<usize>,
idle_ttl: Option<Duration>,
}
impl Eviction {
#[must_use]
pub const fn capacity(max_keys: usize) -> Self {
Self {
max_keys: Some(max_keys),
idle_ttl: None,
}
}
#[must_use]
pub const fn idle(ttl: Duration) -> Self {
Self {
max_keys: Some(DEFAULT_MAX_KEYS),
idle_ttl: Some(ttl),
}
}
#[must_use]
pub const fn new(max_keys: usize, ttl: Duration) -> Self {
Self {
max_keys: Some(max_keys),
idle_ttl: Some(ttl),
}
}
#[must_use]
pub const fn unbounded() -> Self {
Self {
max_keys: None,
idle_ttl: None,
}
}
#[must_use]
pub const fn with_capacity(mut self, max_keys: usize) -> Self {
self.max_keys = Some(max_keys);
self
}
#[must_use]
pub const fn with_idle(mut self, ttl: Duration) -> Self {
self.idle_ttl = Some(ttl);
self
}
#[must_use]
pub const fn without_capacity(mut self) -> Self {
self.max_keys = None;
self
}
#[must_use]
pub const fn max_keys(&self) -> Option<usize> {
self.max_keys
}
#[must_use]
pub const fn idle_ttl(&self) -> Option<Duration> {
self.idle_ttl
}
}
impl Default for Eviction {
fn default() -> Self {
Self::capacity(DEFAULT_MAX_KEYS)
}
}
#[cfg(test)]
mod tests {
use super::{DEFAULT_MAX_KEYS, Eviction};
use core::time::Duration;
#[test]
fn test_default_is_bounded() {
let policy = Eviction::default();
assert_eq!(policy.max_keys(), Some(DEFAULT_MAX_KEYS));
assert_eq!(policy.idle_ttl(), None);
}
#[test]
fn test_idle_keeps_default_cap() {
let policy = Eviction::idle(Duration::from_secs(5));
assert_eq!(policy.max_keys(), Some(DEFAULT_MAX_KEYS));
assert_eq!(policy.idle_ttl(), Some(Duration::from_secs(5)));
}
#[test]
fn test_unbounded_has_no_bounds() {
let policy = Eviction::unbounded();
assert_eq!(policy.max_keys(), None);
assert_eq!(policy.idle_ttl(), None);
}
#[test]
fn test_builders_compose() {
let policy = Eviction::capacity(10).with_idle(Duration::from_secs(1));
assert_eq!(policy.max_keys(), Some(10));
assert_eq!(policy.idle_ttl(), Some(Duration::from_secs(1)));
let dropped = policy.without_capacity();
assert_eq!(dropped.max_keys(), None);
assert_eq!(dropped.idle_ttl(), Some(Duration::from_secs(1)));
}
}