use crate::trit::{decide, Trit};
#[derive(Debug, Clone, PartialEq)]
pub enum Signal {
Resolved(Trit),
Held { confidence: f64 },
}
pub fn evaluate(evidence: &[f64]) -> Signal {
let (trit, confidence) = decide(evidence);
match trit {
Trit::Tend => Signal::Held { confidence },
resolved => Signal::Resolved(resolved),
}
}
pub fn resolve(_held: Signal, resolution: Trit) -> Trit {
resolution
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn decisive_evidence_resolves_immediately() {
assert_eq!(evaluate(&[0.9]), Signal::Resolved(Trit::Affirm));
assert_eq!(evaluate(&[-0.9]), Signal::Resolved(Trit::Reject));
}
#[test]
fn ambiguous_evidence_holds_instead_of_forcing_a_decision() {
match evaluate(&[0.1, -0.05]) {
Signal::Held { .. } => {}
other => panic!("expected Held, got {other:?}"),
}
}
#[test]
fn a_held_signal_can_be_explicitly_resolved() {
let held = evaluate(&[0.0]);
assert_eq!(resolve(held, Trit::Affirm), Trit::Affirm);
}
}