okee-wheel-timer 0.1.0

Deterministic hashed wheel timer with keyed deduplication.
Documentation
use super::KeyedHashedWheelTimer;

#[test]
fn schedule_replaces_existing_event_with_same_key() {
    let mut wheel = KeyedHashedWheelTimer::new(8, |value: &u32| *value);
    let first = wheel.schedule(5, 10);
    let second = wheel.schedule(7, 10);

    assert_eq!(first.id, 1);
    assert_eq!(second.id, 2);
    assert_eq!(second.replaced_id, Some(1));
    assert!(!wheel.contains_by_id(1));
    assert_eq!(wheel.id_by_key(&10), Some(2));
    assert_eq!(wheel.count_all(), 1);
}

#[test]
fn update_by_key_changes_identity_and_removes_old_key() {
    let mut wheel = KeyedHashedWheelTimer::new(8, |value: &u32| *value);
    let created = wheel.schedule(1, 10);

    let updated = wheel
        .update_by_key(&10, 2, 20)
        .expect("keyed event should exist");

    assert_eq!(updated.id, created.id);
    assert!(!wheel.contains_by_key(&10));
    assert!(wheel.contains_by_key(&20));
    assert_eq!(wheel.id_by_key(&20), Some(created.id));
}

#[test]
fn pop_events_cleans_key_index() {
    let mut wheel = KeyedHashedWheelTimer::new(4, |value: &u32| *value);
    let created = wheel.schedule(0, 10);
    assert_eq!(wheel.id_by_key(&10), Some(created.id));

    let popped = wheel.pop_events();
    assert_eq!(popped.len(), 1);
    assert!(!wheel.contains_by_key(&10));
}