catalan 0.3.3

binary tree of n variables where the parent node represents a function and the child node represents a value.
Documentation
use std::slice::Iter;

#[rustfmt::skip]
pub fn catalan_tree3<T: Copy>() -> Iter<'static, fn(&[fn(T, T) -> T], &[T]) -> T> {
    let fs: &[fn(&[fn(T, T) -> T], &[T]) -> T; 2] = &[
        |f, n| f[0](n[0], f[1](n[1], n[2])),
        |f, n| f[0](f[1](n[0], n[1]), n[2])
    ];
    return fs.iter();
}

pub fn catalan_tree4<T: Copy>() -> Iter<'static, fn(&[fn(T, T) -> T], &[T]) -> T> {
    let fs: &[fn(&[fn(T, T) -> T], &[T]) -> T; 5] = &[
        |f, n| f[0](n[0], f[1](n[1], f[2](n[2], n[3]))),
        |f, n| f[0](n[0], f[1](f[2](n[1], n[2]), n[3])),
        |f, n| f[0](f[1](n[0], n[1]), f[2](n[2], n[3])),
        |f, n| f[0](f[1](n[0], f[2](n[1], n[2])), n[3]),
        |f, n| f[0](f[1](f[2](n[0], n[1]), n[2]), n[3]),
    ];
    return fs.iter();
}

pub fn catalan_tree5<T: Copy>() -> Iter<'static, fn(&[fn(T, T) -> T], &[T]) -> T> {
    let fs: &[fn(&[fn(T, T) -> T], &[T]) -> T; 14] = &[
        |f, n| f[0](n[0], f[1](n[1], f[2](n[2], f[3](n[3], n[4])))),
        |f, n| f[0](n[0], f[1](n[1], f[2](f[3](n[2], n[3]), n[4]))),
        |f, n| f[0](n[0], f[1](f[2](n[1], n[2]), f[3](n[3], n[4]))),
        |f, n| f[0](n[0], f[1](f[2](n[1], f[3](n[2], n[3])), n[4])),
        |f, n| f[0](n[0], f[1](f[2](f[3](n[1], n[2]), n[3]), n[4])),
        |f, n| f[0](f[1](n[0], n[1]), f[2](n[2], f[3](n[3], n[4]))),
        |f, n| f[0](f[1](n[0], n[1]), f[2](f[3](n[2], n[3]), n[4])),
        |f, n| f[0](f[1](n[0], f[2](n[1], n[2])), f[3](n[3], n[4])),
        |f, n| f[0](f[1](f[2](n[0], n[1]), n[2]), f[3](n[3], n[4])),
        |f, n| f[0](f[1](n[0], f[2](n[1], f[3](n[2], n[3]))), n[4]),
        |f, n| f[0](f[1](n[0], f[2](f[3](n[1], n[2]), n[3])), n[4]),
        |f, n| f[0](f[1](f[2](n[0], n[1]), f[3](n[2], n[3])), n[4]),
        |f, n| f[0](f[1](f[2](n[0], f[3](n[1], n[2])), n[3]), n[4]),
        |f, n| f[0](f[1](f[2](f[3](n[0], n[1]), n[2]), n[3]), n[4]),
    ];
    return fs.iter();
}

pub fn catalan_tree6<T: Copy>() -> Iter<'static, fn(&[fn(T, T) -> T], &[T]) -> T> {
    let fs: &[fn(&[fn(T, T) -> T], &[T]) -> T; 42] = &[
        |f, n| f[0](n[0], f[1](n[1], f[2](n[2], f[3](n[3], f[4](n[4], n[5]))))),
        |f, n| f[0](n[0], f[1](n[1], f[2](n[2], f[3](f[4](n[3], n[4]), n[5])))),
        |f, n| f[0](n[0], f[1](n[1], f[2](f[3](n[2], n[3]), f[4](n[4], n[5])))),
        |f, n| f[0](n[0], f[1](n[1], f[2](f[3](n[2], f[4](n[3], n[4])), n[5]))),
        |f, n| f[0](n[0], f[1](n[1], f[2](f[3](f[4](n[2], n[3]), n[4]), n[5]))),
        |f, n| f[0](n[0], f[1](f[2](n[1], n[2]), f[3](n[3], f[4](n[4], n[5])))),
        |f, n| f[0](n[0], f[1](f[2](n[1], n[2]), f[3](f[4](n[3], n[4]), n[5]))),
        |f, n| f[0](n[0], f[1](f[2](n[1], f[3](n[2], n[3])), f[4](n[4], n[5]))),
        |f, n| f[0](n[0], f[1](f[2](f[3](n[1], n[2]), n[3]), f[4](n[4], n[5]))),
        |f, n| f[0](n[0], f[1](f[2](n[1], f[3](n[2], f[4](n[3], n[4]))), n[5])),
        |f, n| f[0](n[0], f[1](f[2](n[1], f[3](f[4](n[2], n[3]), n[4])), n[5])),
        |f, n| f[0](n[0], f[1](f[2](f[3](n[1], n[2]), f[4](n[3], n[4])), n[5])),
        |f, n| f[0](n[0], f[1](f[2](f[3](n[1], f[4](n[2], n[3])), n[4]), n[5])),
        |f, n| f[0](n[0], f[1](f[2](f[3](f[4](n[1], n[2]), n[3]), n[4]), n[5])),
        |f, n| f[0](f[1](n[0], n[1]), f[2](n[2], f[3](n[3], f[4](n[4], n[5])))),
        |f, n| f[0](f[1](n[0], n[1]), f[2](n[2], f[3](f[4](n[3], n[4]), n[5]))),
        |f, n| f[0](f[1](n[0], n[1]), f[2](f[3](n[2], n[3]), f[4](n[4], n[5]))),
        |f, n| f[0](f[1](n[0], n[1]), f[2](f[3](n[2], f[4](n[3], n[4])), n[5])),
        |f, n| f[0](f[1](n[0], n[1]), f[2](f[3](f[4](n[2], n[3]), n[4]), n[5])),
        |f, n| f[0](f[1](n[0], f[2](n[1], n[2])), f[3](n[3], f[4](n[4], n[5]))),
        |f, n| f[0](f[1](n[0], f[2](n[1], n[2])), f[3](f[4](n[3], n[4]), n[5])),
        |f, n| f[0](f[1](f[2](n[0], n[1]), n[2]), f[3](n[3], f[4](n[4], n[5]))),
        |f, n| f[0](f[1](f[2](n[0], n[1]), n[2]), f[3](f[4](n[3], n[4]), n[5])),
        |f, n| f[0](f[1](n[0], f[2](n[1], f[3](n[2], n[3]))), f[4](n[4], n[5])),
        |f, n| f[0](f[1](n[0], f[2](f[3](n[1], n[2]), n[3])), f[4](n[4], n[5])),
        |f, n| f[0](f[1](f[2](n[0], n[1]), f[3](n[2], n[3])), f[4](n[4], n[5])),
        |f, n| f[0](f[1](f[2](n[0], f[3](n[1], n[2])), n[3]), f[4](n[4], n[5])),
        |f, n| f[0](f[1](f[2](f[3](n[0], n[1]), n[2]), n[3]), f[4](n[4], n[5])),
        |f, n| f[0](f[1](n[0], f[2](n[1], f[3](n[2], f[4](n[3], n[4])))), n[5]),
        |f, n| f[0](f[1](n[0], f[2](n[1], f[3](f[4](n[2], n[3]), n[4]))), n[5]),
        |f, n| f[0](f[1](n[0], f[2](f[3](n[1], n[2]), f[4](n[3], n[4]))), n[5]),
        |f, n| f[0](f[1](n[0], f[2](f[3](n[1], f[4](n[2], n[3])), n[4])), n[5]),
        |f, n| f[0](f[1](n[0], f[2](f[3](f[4](n[1], n[2]), n[3]), n[4])), n[5]),
        |f, n| f[0](f[1](f[2](n[0], n[1]), f[3](n[2], f[4](n[3], n[4]))), n[5]),
        |f, n| f[0](f[1](f[2](n[0], n[1]), f[3](f[4](n[2], n[3]), n[4])), n[5]),
        |f, n| f[0](f[1](f[2](n[0], f[3](n[1], n[2])), f[4](n[3], n[4])), n[5]),
        |f, n| f[0](f[1](f[2](f[3](n[0], n[1]), n[2]), f[4](n[3], n[4])), n[5]),
        |f, n| f[0](f[1](f[2](n[0], f[3](n[1], f[4](n[2], n[3]))), n[4]), n[5]),
        |f, n| f[0](f[1](f[2](n[0], f[3](f[4](n[1], n[2]), n[3])), n[4]), n[5]),
        |f, n| f[0](f[1](f[2](f[3](n[0], n[1]), f[4](n[2], n[3])), n[4]), n[5]),
        |f, n| f[0](f[1](f[2](f[3](n[0], f[4](n[1], n[2])), n[3]), n[4]), n[5]),
        |f, n| f[0](f[1](f[2](f[3](f[4](n[0], n[1]), n[2]), n[3]), n[4]), n[5]),
    ];
    return fs.iter();
}