#[derive(Debug, Clone)]
pub struct Signal {
pub success: bool,
pub effort: f32,
pub metadata: std::collections::HashMap<String, String>,
}
impl Signal {
pub fn new(success: bool, effort: f32) -> Self {
Self {
success,
effort: effort.clamp(0.0, 1.0),
metadata: std::collections::HashMap::new(),
}
}
pub fn with_metadata(
success: bool,
effort: f32,
metadata: std::collections::HashMap<String, String>,
) -> Self {
Self {
success,
effort: effort.clamp(0.0, 1.0),
metadata,
}
}
pub fn performance(&self) -> f32 {
if self.success {
0.5 + 0.5 * (1.0 - self.effort)
} else {
0.0
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn performance_easy_success() {
let s = Signal::new(true, 0.0);
assert!((s.performance() - 1.0).abs() < 1e-6);
}
#[test]
fn performance_hard_success() {
let s = Signal::new(true, 1.0);
assert!((s.performance() - 0.5).abs() < 1e-6);
}
#[test]
fn performance_failure() {
let s = Signal::new(false, 0.3);
assert!((s.performance() - 0.0).abs() < 1e-6);
}
#[test]
fn effort_clamped() {
let s = Signal::new(true, 1.5);
assert_eq!(s.effort, 1.0);
let s2 = Signal::new(true, -0.5);
assert_eq!(s2.effort, 0.0);
}
}