use crate::progress::Progress;
use crate::Termination;
#[derive(Debug)]
pub struct EventBatch<F> {
pub events: Vec<Progress<F>>,
}
impl<F> Default for EventBatch<F> {
fn default() -> Self {
Self::new()
}
}
impl<F> EventBatch<F> {
pub fn new() -> Self {
Self { events: vec![] }
}
pub fn add(mut self, event: Progress<F>) -> Self {
self.events.push(event);
self
}
}
#[derive(Clone, Debug, PartialEq)]
pub enum EngineAction {
Continue,
EmitCheckpoint(CheckpointReason),
Stop(Termination),
}
#[derive(Clone, Debug, PartialEq)]
pub enum CheckpointReason {
Scheduled,
Stagnation,
UserRequest,
}
pub enum EngineSignal<F> {
Initialised,
Progress(Progress<F>),
CheckpointSaved,
CheckpointRequested(CheckpointReason),
Termination(Termination),
}
impl<F> EngineSignal<F> {
pub fn as_tag(&self) -> &'static str {
match self {
Self::Initialised => "initialised",
Self::Progress(_) => "progress",
Self::CheckpointSaved => "checkpoint_saved",
Self::Termination(_) => "termination",
Self::CheckpointRequested(_) => "checkpoint_requested",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn event_batch_accumulates_events() {
let batch = EventBatch::new()
.add(Progress::Measure(1.0))
.add(Progress::Measure(2.0));
assert_eq!(batch.events.len(), 2);
}
}