///|
/// 事件优先级:数值越小优先级越高
pub type EventPriority = Int
///|
/// 事件 ID 类型,用于唯一标识事件
pub type EventId = Int
///|
/// 仿真进程 ID 类型
pub type ProcessId = Int
///|
/// 事件状态
pub(all) enum EventStatus {
Pending
Triggered
Canceled
} derive(Debug, Eq)
///|
/// 仿真事件
///
/// 事件是离散事件仿真的基本调度单元,按 `(time, priority)` 排序:
/// 时间越小越早执行,同一时间下优先级数值越小越先执行。
pub(all) struct Event {
id : EventId
time : Double
priority : EventPriority
mut status : EventStatus
callbacks : Array[() -> Unit]
}
///|
/// 事件排序比较:先按时间,再按优先级
fn event_compare(a : Event, b : Event) -> Int {
if a.time < b.time {
-1
} else if a.time > b.time {
1
} else if a.priority < b.priority {
-1
} else if a.priority > b.priority {
1
} else {
0
}
}
///|
/// 创建新事件
pub fn new_event(
id~ : EventId,
time~ : Double,
priority? : EventPriority = 0,
callback~ : () -> Unit,
) -> Event {
{ id, time, priority, status: Pending, callbacks: [callback] }
}
///|
/// 向事件追加回调
pub fn Event::add_callback(self : Event, callback : () -> Unit) -> Unit {
self.callbacks.push(callback)
}
///|
/// 触发事件:执行所有回调
pub fn Event::trigger(self : Event) -> Unit {
if self.status is Pending {
self.status = Triggered
for cb in self.callbacks {
cb()
}
}
}
///|
/// 取消事件
pub fn Event::cancel(self : Event) -> Unit {
self.status = Canceled
}
///|
/// 事件是否仍待处理
pub fn Event::is_pending(self : Event) -> Bool {
self.status is Pending
}