use std::ops::Not;
use super::{
StatefulTester,
rc_stateful_tester::RcStatefulTester,
};
pub struct BoxStatefulTester {
pub(super) function: Box<dyn FnMut() -> bool>,
}
impl BoxStatefulTester {
#[inline]
pub fn new<F>(f: F) -> Self
where
F: FnMut() -> bool + 'static,
{
BoxStatefulTester {
function: Box::new(f),
}
}
#[inline]
pub fn and<T>(mut self, mut next: T) -> BoxStatefulTester
where
T: StatefulTester + 'static,
{
BoxStatefulTester::new(move || self.test() && next.test())
}
#[inline]
pub fn or<T>(mut self, mut next: T) -> BoxStatefulTester
where
T: StatefulTester + 'static,
{
BoxStatefulTester::new(move || self.test() || next.test())
}
#[inline]
pub fn nand<T>(mut self, mut next: T) -> BoxStatefulTester
where
T: StatefulTester + 'static,
{
BoxStatefulTester::new(move || !(self.test() && next.test()))
}
#[inline]
pub fn xor<T>(mut self, mut next: T) -> BoxStatefulTester
where
T: StatefulTester + 'static,
{
BoxStatefulTester::new(move || self.test() ^ next.test())
}
#[inline]
pub fn nor<T>(mut self, mut next: T) -> BoxStatefulTester
where
T: StatefulTester + 'static,
{
BoxStatefulTester::new(move || !(self.test() || next.test()))
}
}
impl Not for BoxStatefulTester {
type Output = BoxStatefulTester;
#[inline]
fn not(mut self) -> Self::Output {
BoxStatefulTester::new(move || !self.test())
}
}
impl StatefulTester for BoxStatefulTester {
#[inline]
fn test(&mut self) -> bool {
(self.function)()
}
#[inline]
fn into_box(self) -> BoxStatefulTester {
self
}
#[inline]
fn into_rc(self) -> RcStatefulTester {
let function = self.function;
RcStatefulTester::new(function)
}
}