#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum OperatorClass {
Cross,
ThresholdCompare,
ZoneEnter,
ZoneExit,
NBarExtreme,
Pivot,
Direction,
Divergence,
CandlePattern,
RegimeGate,
Sequence,
VolatilityRegime,
VolumeEvent,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Strictness {
OnEdge,
Persistent,
FirstTime,
NBarsConfirmed(usize),
}
pub fn strictness_for(op: OperatorClass) -> Strictness {
match op {
OperatorClass::Cross => Strictness::OnEdge,
OperatorClass::ThresholdCompare => Strictness::Persistent,
OperatorClass::ZoneEnter => Strictness::FirstTime,
OperatorClass::ZoneExit => Strictness::FirstTime,
OperatorClass::NBarExtreme => Strictness::OnEdge,
OperatorClass::Pivot => Strictness::OnEdge,
OperatorClass::Direction => Strictness::NBarsConfirmed(1),
OperatorClass::Divergence => Strictness::OnEdge,
OperatorClass::CandlePattern => Strictness::OnEdge,
OperatorClass::RegimeGate => Strictness::Persistent,
OperatorClass::Sequence => Strictness::OnEdge,
OperatorClass::VolatilityRegime => Strictness::FirstTime,
OperatorClass::VolumeEvent => Strictness::OnEdge,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn cross_strictness_is_on_edge() {
assert_eq!(strictness_for(OperatorClass::Cross), Strictness::OnEdge);
}
#[test]
fn threshold_strictness_is_persistent() {
assert_eq!(strictness_for(OperatorClass::ThresholdCompare), Strictness::Persistent);
}
#[test]
fn zone_enter_strictness_is_first_time() {
assert_eq!(strictness_for(OperatorClass::ZoneEnter), Strictness::FirstTime);
}
#[test]
fn direction_strictness_is_nbar_confirmed() {
assert!(matches!(strictness_for(OperatorClass::Direction), Strictness::NBarsConfirmed(1)));
}
}