package org.nutz.lang.util;
import java.util.Iterator;
import java.util.List;
import org.nutz.lang.Each;
/**
* 树节点。
*
* @author zozoh(zozohtnt@gmail.com)
*
* @param <T>
*/
public interface Node<T> {
T get();
Node<T> set(T obj);
Node<T> parent(Node<T> node);
Node<T> parent();
Node<T> top();
Node<T> prev();
Node<T> prev(Node<T> node);
Node<T> prev(int index);
Node<T> next();
Node<T> next(Node<T> node);
Node<T> next(int index);
Node<T> add(Node<?>... nodes);
Node<T> addFirst(Node<T> node);
Node<T> pop();
Node<T> popFirst();
Node<T> removeChild(int index);
int getIndex();
/**
* @return true 成功移除,false 不能移除
*/
boolean remove();
Node<T> clearChildren();
Node<T> insertBefore(int index, Node<T> node);
boolean isRoot();
boolean isLast();
boolean isFirst();
List<Node<T>> getAncestors();
List<Node<T>> parents();
int depth();
List<Node<T>> getNextSibling();
List<Node<T>> getPrevSibling();
int index();
List<Node<T>> getChildren();
Node<T> child(int index);
Node<T> desc(int... indexes);
int countChildren();
boolean hasChild();
Node<T> firstChild();
Node<T> lastChild();
Iterator<Node<T>> iterator();
<E extends Node<T>> void eachChild(Each<E> callback);
}