code: public static <A> ProgramChromosome<A> of(
  		final int depth,
  		final Predicate<? super ProgramChromosome<A>> validator,
  		final ISeq<? extends Op<A>> operations,
  		final ISeq<? extends Op<A>> terminals
  	) {
  		checkOperations(operations);
  		checkTerminals(terminals);
  
  		return create(depth, validator, operations, terminals);
  	}
docs: Create a new program chromosome with the defined depth. This method will
  create a <em>full</em> program tree.
  
  @param depth the depth of the created program tree
  @param validator the chromosome validator. A typical validator would
  check the size of the tree and if the tree is too large, mark it
  at <em>invalid</em>. The <em>validator</em> may be {@code null}.
  @param operations the allowed non-terminal operations
  @param terminals the allowed terminal operations
  @param <A> the operation type
  @return a new program chromosome from the given (flattened) program tree
  @throws NullPointerException if one of the parameters is {@code null}
  @throws IllegalArgumentException if the {@code depth} is smaller than zero