docs: public static <A> TreeNode<Op<A>> of(
  		final int depth,
  		final ISeq<? extends Op<A>> operations,
  		final ISeq<? extends Op<A>> terminals,
  		final Random random
  	) {
  		if (depth < 0) {
  			throw new IllegalArgumentException(
  				"Tree depth is smaller than zero: " + depth
  			);
  		}
  		if (!operations.forAll(o -> !o.isTerminal())) {
  			throw new IllegalArgumentException(
  				"Operation list contains terminal op."
  			);
  		}
  		if (!terminals.forAll(o -> o.isTerminal())) {
  			throw new IllegalArgumentException(
  				"Terminal list contains non-terminal op."
  			);
  		}
  
  		final TreeNode<Op<A>> root = TreeNode.of();
  		fill(depth, root, operations, terminals, random);
  		return root;
  	}