Program implements Op<T>, Serializable { public static <A> Program<A> of( final String name, final int depth, final ISeq<? extends Op<A>> operations, final ISeq<? extends Op<A>> terminals ) { return new Program<>(name, of(depth, operations, terminals)); } Program(final String name, final Tree<? extends Op<T>, ?> tree); @Override String name(); @Override int arity(); Tree<Op<T>, ?> tree(); @Override T apply(final T[] args); @SafeVarargs final T eval(final T... args); @Override int hashCode(); @Override boolean equals(final Object obj); @Override String toString(); @SafeVarargs static T eval(
		final Tree<? extends Op<T>, ?> tree,
		final T... variables
	); static void check(final Tree<? extends Op<?>, ?> program); static Program<A> of(
		final String name,
		final int depth,
		final ISeq<? extends Op<A>> operations,
		final ISeq<? extends Op<A>> terminals
	); static Program<A> of(
		final String name,
		final int depth,
		final ISeq<? extends Op<A>> operations,
		final ISeq<? extends Op<A>> terminals,
		final Random random
	); static TreeNode<Op<A>> of(
		final int depth,
		final ISeq<? extends Op<A>> operations,
		final ISeq<? extends Op<A>> terminals
	); static TreeNode<Op<A>> of(
		final int depth,
		final ISeq<? extends Op<A>> operations,
		final ISeq<? extends Op<A>> terminals,
		final Random random
	); static TreeNode<Op<A>> toTree(
		final ISeq<? extends FlatTree<? extends Op<A>, ?>> nodes,
		final ISeq<? extends Op<A>> terminals
	);  }
@Test public void serialize() throws IOException { final Program<Double> object = Program.of( "oops", 5, OPERATIONS, TERMINALS ); final byte[] data = IO.object.toByteArray(object); Assert.assertEquals(IO.object.fromByteArray(data), object); }