abstract class LisioWalker {
  protected _walker: TreeWalker;

  /**
   * Constructor of class {@link Walker | Walker}
   * @param {number} whatToShow - Type of tree walker
   * @param {NodeFilter | undefined} filter - Custom filter for tree walker
   */
  constructor(
    whatToShow: number,
    root: HTMLElement,
    filter: NodeFilter | undefined,
  ) {
    this._walker = document.createTreeWalker(root, whatToShow, filter);
  }

  public explore(callback: (node: Node) => void) {
    let node: Node | null = this._walker.nextNode();
    while (node != undefined) {
      callback(node);
      node = this._walker.nextNode();
    }
    this._walker.currentNode = this._walker.root;
  }

  public resetWalker() {
    this._walker.currentNode = this._walker.root;
  }
}

export default LisioWalker;
