code: public static <T, P> Optional<T> findByPath(TreeDef<T> treeDef, T node, List<P> path, BiPredicate<T, P> equality) {
  		T value = node;
  		for (P segment : path) {
  			Optional<T> valueOpt = treeDef.childrenOf(value).stream().filter(n -> equality.test(n, segment)).findFirst();
  			if (!valueOpt.isPresent()) {
  				return valueOpt;
  			}
  			value = valueOpt.get();
  		}
  		return Optional.of(value);
  	}
docs: Finds a child TreeNode based on its path.
  <p>
  Searches the child nodes for the first element, then that
  node's children for the second element, etc.
  
  @param treeDef	defines a tree
  @param node		starting point for the search
  @param path		the path of nodes which we're looking
  @param equality	a function for determining equality between the tree nodes and the path elements