/** Creates a mutable list whose first element is {@code node}, and last element is its root parent. */ public static <T> List<T> toRoot(TreeDef.Parented<T> treeDef, T node) { requireNonNull(node); List<T> list = new ArrayList<>(); T tip = node; while (tip != null) { list.add(tip); tip = treeDef.parentOf(tip); } return list; }
/** * Creates a mutable list whose first element is {@code node}, and last element is {@code parent}. * @throws IllegalArgumentException if {@code parent} is not a parent of {@code node} */ public static <T> List<T> toParent(TreeDef.Parented<T> treeDef, T node, T parent) { requireNonNull(node); requireNonNull(parent); List<T> list = new ArrayList<>(); T tip = node; while (true) { list.add(tip); tip = treeDef.parentOf(tip); if (tip == null) { throw new IllegalArgumentException(parent + " is not a parent of " + node); } else if (tip.equals(parent)) { list.add(parent); return list; } } }
/** Returns true iff child is a descendant of parent. */ public static <T> boolean isDescendantOf(TreeDef.Parented<T> treeDef, T child, T parent) { requireNonNull(child); requireNonNull(parent); T candidateParent = treeDef.parentOf(child); while (candidateParent != null) { if (candidateParent.equals(parent)) { return true; } else { candidateParent = treeDef.parentOf(candidateParent); } } return false; }
@Override public Object getParent(Object element) { return treeDef.parentOf((T) element); }
@Override public Object getParent(Object element) { return treeDef.parentOf((T) element); } });
/** Creates a new {@code TreeDef.Parented} whose {@code childrenOf} and {@code parentOf} methods are filtered by {@code predicate}. */ @Override default Parented<T> filter(Predicate<T> predicate) { return of(node -> TreeImp.filteredList(childrenOf(node), predicate), node -> { if (predicate.test(node)) { return parentOf(node); } else { return null; } }); }
/** Returns the root of the given tree. */ public static <T> T root(TreeDef.Parented<T> treeDef, T node) { T lastParent; T parent = node; do { lastParent = parent; parent = treeDef.parentOf(lastParent); } while (parent != null); return lastParent; }