okee-wheel-timer 0.1.0

Deterministic hashed wheel timer with keyed deduplication.
Documentation
use okee_wheel_timer::{HashedWheelTimer, KeyedHashedWheelTimer};

#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
struct UserEvent {
    topic: u32,
    source: u32,
}

#[test]
fn core_schedule_and_query_by_id() {
    let mut wheel = HashedWheelTimer::new(8);
    let created = wheel.schedule(
        5,
        UserEvent {
            topic: 1,
            source: 10,
        },
    );

    assert!(wheel.contains(created.id));
    assert_eq!(wheel.get(created.id).map(|e| e.tick()), Some(5));
}

#[test]
fn core_schedule_allows_same_payload_many_times() {
    let mut wheel = HashedWheelTimer::new(8);
    let first = wheel.schedule(
        1,
        UserEvent {
            topic: 1,
            source: 10,
        },
    );
    let second = wheel.schedule(
        2,
        UserEvent {
            topic: 1,
            source: 10,
        },
    );

    assert!(wheel.contains(first.id));
    assert!(wheel.contains(second.id));
    assert_eq!(wheel.count_all(), 2);
}

#[test]
fn keyed_schedule_replaces_by_key() {
    let mut wheel = KeyedHashedWheelTimer::new(8, |data: &UserEvent| (data.topic, data.source));
    let first = wheel.schedule(
        1,
        UserEvent {
            topic: 1,
            source: 10,
        },
    );
    let second = wheel.schedule(
        2,
        UserEvent {
            topic: 1,
            source: 10,
        },
    );

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

#[test]
fn keyed_update_and_remove_by_key() {
    let mut wheel = KeyedHashedWheelTimer::new(8, |data: &UserEvent| (data.topic, data.source));
    let created = wheel.schedule(
        1,
        UserEvent {
            topic: 1,
            source: 10,
        },
    );

    let updated = wheel.update_by_key(
        &(1, 10),
        3,
        UserEvent {
            topic: 2,
            source: 20,
        },
    );

    assert_eq!(updated.map(|r| r.id), Some(created.id));
    assert!(wheel.contains_by_key(&(2, 20)));

    let removed = wheel.remove_by_key(&(2, 20));
    assert_eq!(removed.map(|e| e.id()), Some(created.id));
    assert!(wheel.is_empty());
}