mod gen;
pub use self::gen::*;
use rand::Rng;
use std::fmt::{self, Debug};
use std::ops::{Deref, DerefMut};
use std::collections::VecDeque;
pub trait Tree
where Self: Sized + Debug + Clone
{
type Environment;
type Action;
fn tree<R: Rng>(tg: &mut TreeGen<R>) -> BoxTree<Self> {
Self::child(tg, 0)
}
fn child<R: Rng>(tg: &mut TreeGen<R>, current_depth: usize) -> BoxTree<Self> {
if tg.have_reached_a_leaf(current_depth) {
Self::leaf(tg, current_depth)
} else {
Self::branch(tg, current_depth)
}
}
fn branch<R: Rng>(tg: &mut TreeGen<R>, current_depth: usize) -> BoxTree<Self>;
fn leaf<R: Rng>(tg: &mut TreeGen<R>, current_depth: usize) -> BoxTree<Self>;
fn count_children(&mut self) -> usize;
fn children(&self) -> Vec<&BoxTree<Self>>;
fn children_mut(&mut self) -> Vec<&mut BoxTree<Self>>;
fn evaluate(&self, env: &Self::Environment) -> Self::Action;
}
#[derive(Clone, PartialEq, Eq)]
pub struct BoxTree<T>(Box<T>) where T: Tree;
impl<T> BoxTree<T>
where T: Tree
{
pub fn inner(self) -> T {
*self.0
}
pub fn count_nodes(&mut self) -> usize {
self.fold(0, |count, _, _, _| count + 1)
}
pub fn get(&mut self, target_index: usize) -> Option<T> {
let mut node = None;
self.map_while(|current, index, _| if index == target_index {
node = Some(current.clone());
false
} else {
true
});
node
}
pub fn map<F>(&mut self, mut f: F)
where F: FnMut(&mut T, usize, usize)
{
self.map_while(|p, i, d| {
f(p, i, d);
true
})
}
pub fn map_while<F>(&mut self, mut f: F)
where F: FnMut(&mut T, usize, usize) -> bool
{
let mut stack: VecDeque<(&mut Self, usize)> = VecDeque::new();
stack.push_back((self, 0));
let mut i = 0;
while let Some((node, depth)) = stack.pop_back() {
if !f(node, i, depth) {
break;
}
let mut children = node.children_mut();
children.reverse();
for child in children {
stack.push_back((child, depth + 1));
}
i += 1;
}
}
pub fn fold<F, V>(&mut self, value: V, mut f: F) -> V
where F: FnMut(V, &mut T, usize, usize) -> V
{
self.fold_while(value, |v, p, i, d| (true, f(v, p, i, d)))
}
pub fn fold_while<F, V>(&mut self, mut value: V, mut f: F) -> V
where F: FnMut(V, &mut T, usize, usize) -> (bool, V)
{
let mut stack: VecDeque<(&mut Self, usize)> = VecDeque::new();
stack.push_back((self, 0));
let mut i = 0;
while let Some((node, depth)) = stack.pop_back() {
value = match f(value, node, i, depth) {
(true, value) => value,
(false, value) => return value,
};
let mut children = node.children_mut();
children.reverse();
for child in children {
stack.push_back((child, depth + 1));
}
i += 1;
}
value
}
}
impl<T> Debug for BoxTree<T>
where T: Tree
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
self.0.fmt(f)
}
}
impl<T> fmt::Display for BoxTree<T>
where T: Tree + fmt::Display
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.0)
}
}
impl<T> Deref for BoxTree<T>
where T: Tree
{
type Target = T;
fn deref(&self) -> &T {
&self.0
}
}
impl<T> DerefMut for BoxTree<T>
where T: Tree
{
fn deref_mut(&mut self) -> &mut T {
&mut self.0
}
}
impl<T> From<T> for BoxTree<T>
where T: Tree
{
fn from(tree: T) -> BoxTree<T> {
BoxTree(Box::new(tree))
}
}