use uuid::Uuid;
use hierarchical_hash_wheel_timer::{
thread_timer::{TimerRef as GenericTimerRef, TimerWithThread as GenericTimerWithThread},
OneshotState,
PeriodicState,
TimerEntry as GenericTimerEntry,
TimerReturn as GenericTimerReturn,
};
pub use hierarchical_hash_wheel_timer::TimerError;
#[allow(clippy::type_complexity)]
pub(crate) mod timer_manager;
use timer_manager::{Timeout, TimerActorRef};
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash)]
pub enum TimerReturn {
#[default]
Reschedule,
Cancel,
}
impl TimerReturn {
pub fn should_reschedule(&self) -> bool {
match self {
TimerReturn::Reschedule => true,
TimerReturn::Cancel => false,
}
}
}
impl From<TimerReturn> for GenericTimerReturn<()> {
fn from(tr: TimerReturn) -> Self {
match tr {
TimerReturn::Reschedule => GenericTimerReturn::Reschedule(()),
TimerReturn::Cancel => GenericTimerReturn::Cancel,
}
}
}
pub type TimerEntry = GenericTimerEntry<Uuid, ActorRefState, ActorRefState>;
pub type TimerRef = GenericTimerRef<Uuid, ActorRefState, ActorRefState>;
pub type TimerWithThread = GenericTimerWithThread<Uuid, ActorRefState, ActorRefState>;
#[derive(Debug)]
pub struct ActorRefState {
id: Uuid,
receiver: TimerActorRef,
}
impl ActorRefState {
fn new(id: Uuid, receiver: TimerActorRef) -> Self {
ActorRefState { id, receiver }
}
}
impl OneshotState for ActorRefState {
type Id = Uuid;
fn id(&self) -> &Self::Id {
&self.id
}
fn trigger(self) -> () {
let _res = self.receiver.enqueue(Timeout(self.id));
}
}
impl PeriodicState for ActorRefState {
type Id = Uuid;
fn id(&self) -> &Self::Id {
&self.id
}
fn trigger(self) -> GenericTimerReturn<Self> {
match self.receiver.enqueue(Timeout(self.id)) {
Ok(_) => GenericTimerReturn::Reschedule(self),
Err(_) => GenericTimerReturn::Cancel, }
}
}