#[cfg(feature = "try_trait")]
use std::ops::Try;
#[derive(Debug, PartialEq)]
pub enum Statepoint<N, T> {
Nonterminal(N),
Terminal(T),
}
#[cfg(feature = "try_trait")]
impl<N, T> Try for Statepoint<N, T> {
type Ok = N;
type Error = T;
fn into_result(self) -> Result<N, T> {
match self {
Statepoint::Nonterminal(n) => Result::Ok(n),
Statepoint::Terminal(t) => Result::Err(t)
}
}
fn from_error(term: T) -> Self {
Statepoint::Terminal(term)
}
fn from_ok(nonterm: N) -> Self {
Statepoint::Nonterminal(nonterm)
}
}
#[derive(Debug, PartialEq)]
pub enum NodeResult<R, T, N> {
Nonterminal(R, N),
Terminal(T)
}
#[cfg(feature = "try_trait")]
impl<R, T, N> Try for NodeResult<R, T, N> {
type Ok = (R, N);
type Error = T;
fn into_result(self) -> Result<(R, N), T> {
match self {
NodeResult::Nonterminal(r, n) => Result::Ok((r, n)),
NodeResult::Terminal(t) => Result::Err(t)
}
}
fn from_error(term: T) -> Self {
NodeResult::Terminal(term)
}
fn from_ok(nonterm: (R, N)) -> Self {
NodeResult::Nonterminal(nonterm.0, nonterm.1)
}
}
pub trait BehaviorTreeNode {
type Input;
type Nonterminal;
type Terminal;
fn step(self, input: &Self::Input) ->
NodeResult<Self::Nonterminal, Self::Terminal, Self> where
Self: Sized;
}
#[cfg(all(test, feature = "try_trait"))]
mod tests_try {
use std::ops::Try;
#[test]
fn statepoint_try_test() {
use behavior_tree_node::Statepoint;
assert_eq!(Statepoint::Nonterminal::<i64, i64>(5).into_result(),
Result::Ok(5));
assert_eq!(Statepoint::Terminal::<i64, i64>(5).into_result(),
Result::Err(5));
assert_eq!(Statepoint::<i64, i64>::from_error(5), Statepoint::Terminal(5));
assert_eq!(Statepoint::<i64, i64>::from_ok(5), Statepoint::Nonterminal(5));
}
#[test]
fn node_result_try_test() {
use behavior_tree_node::NodeResult;
assert_eq!(NodeResult::Nonterminal::<i64, i64, i64>(5, 4).into_result(),
Result::Ok((5, 4)));
assert_eq!(NodeResult::Terminal::<i64, i64, i64>(5).into_result(),
Result::Err(5));
assert_eq!(NodeResult::<i64, i64, i64>::from_error(5),
NodeResult::Terminal(5));
assert_eq!(NodeResult::<i64, i64, i64>::from_ok((5, 4)),
NodeResult::Nonterminal(5, 4));
}
}