code: public boolean replaceAtPath(final Path path, final TreeNode<T> child) {
  		requireNonNull(path);
  		requireNonNull(child);
  
  		final Optional<TreeNode<T>> old = childAtPath(path);
  		final Optional<TreeNode<T>> parent = old.flatMap(TreeNode::getParent);
  
  		if (parent.isPresent()) {
  			parent.orElseThrow(AssertionError::new)
  				.replace(path.get(path.length() - 1), child);
  		} else {
  			removeAllChildren();
  			setValue(child.getValue());
  
  			final ISeq<TreeNode<T>> nodes = child.childStream()
  				.collect(ISeq.toISeq());
  
  			for (TreeNode<T> node : nodes) {
  				attach(node);
  			}
  		}
  
  		return old.isPresent();
  	}
docs: Replaces the child at the given {@code path} with the given new
  {@code child}. If no child exists at the given path, nothing is replaced.
  
  @since 4.4
  
  @param path the path of the child to replace
  @param child the new child
  @return {@code true} if a child at the given {@code path} existed and
  has been replaced
  @throws NullPointerException if one of the given argument is {@code null}